Beiträge von Paripurn

    Hallo gemu2015,

    ich habe inzwischen eine Lösung gefunden. Die Daten des Gosund SP1 übertrage ich über die globalen Variablen. Das klappt gut.

    Was auf dem SP1 aber auch klappt ist das parsen einer Websend - oder Webquery - Response. Es muss also wirklich am "Volkszähler" mit installiertem SML liegen. Da habe ich mir ganz schön den Kopf zerbrochen. Vielen Dank für eure Geduld.

    Nachdem jetzt die WebQuery Response Auswertung funkiontiert, habe ich mal versucht die Response vom Solar Wechselrichter direkt zu verarbeiten. Diese hat eine ordentliche Größe und ich kann leider nur ungefähr die Hälfte davon auswerten.

    Ich vermute also, dass es da ein Limit gibt.

    Gibt es da eine Möglichkeit das Limit hochzusetzten, z.B. über #define use_websend_response mit einer Zusatzoption? Oder eine andere Möglichkeit die Response nur ab einer bestimmten Position anzufordern?


    =>WebQuery http://5.8.8.8/?optType=ReadRealTimeData POST


    hiermit fordere ich die Response an und bekomme dann folgende Antwort:


    10:34:42.688 RSL: RESULT = {"WebQuery":{"type":"X1-Boost-Air-Mini","SN":"SAAAAAAAAA","ver":"2.033.20","Data":[0.6,0.0,313.3,0.0,1.3,230.7,207,17,0.3,5068.7,0,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00,0.00,0,0,0,0,0,0,0,50.01,0,0,0,0,0,0,0,0,0,0.00,0,0,0,0,0.00,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"Information":[3.000,4,"X1-Boost-Air-Mini","SAAAAAAAAA",1,1.17,0.00,1.14,0.00]}}


    Nach einer Menge einleitendem Gedudel kommt ein langer Array den ich über


    >E

    Webquery#Data[x]


    ansprechen kann. x wäre da eine Zahl beginnend bei 1 bis ca. 50. Bis zur Zahl 6 bekomme ich alle Daten ausgewertet. Ab 7 springt er zum Wert von Zahl 1. Dummerweise würde mir genau der Wert zu 7 reichen.

    Jetzt ist pwr=0, Power allerdings 78. Die Response wird nicht ausgewertet.


    12:41:38.447 Script: performs "WebQuery http://192.168.7.161/cm?cmnd=Status+8 GET"

    12:41:38.753 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2023-02-08T12:41:39","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":80.529,"Yesterday":2.185,"Today":1.698,"Power":78,"ApparentPower":80,"ReactivePower":20,"Factor":0.97,"Voltage":233,"Current":0.343}}}}

    12:41:38.757 RSL: RESULT = {"WebQuery":"Done"}

    12:41:38.760 pwr 0.00

    Hier noch ein Auszug aus dem aktuellen Script

    >B

    =>sensor53 r


    E>

    pwr=StatusSNS#Energy#Power


    >T

    pcurr=Home#power


    >S

    if time>sunrise

    and time<sunset

    then

    if upsecs%10==0

    then

    zei=int(time/60)+((time/60-int(time/60))/100*60)

    sonnafg=int(sunrise/60)+((sunrise/60-int(sunrise/60))/100*60)

    sonnung=int(sunset/60)+((sunset/60-int(sunset/60))/100*60)


    =>WebQuery http://192.168.7.161/cm?cmnd=Status+8 GET


    >M 1

    +1,3,s,16,9600,Home

    1,77070100010800ff@1000,Energie:,kWh,energy,4

    1,77070100100700ff@1,Leistung:,W,power,2

    #

    Leider auch nicht. Ich habe langsam die Vermutung, dass es mit den Sensoren des Stromzählers zu tun hat. Diese werden ja auch noch erfasst und beinhalten die Werte für energy und power.

    Vielleicht kann nur ein Mal Energy und Power erfasst werden.

    Ich wäre, wenn es so nicht funktioniert auch mit der Funktion json.parse (), die ja aus JavaScript bekannt ist, einverstanden. Bin mir aber nicht sicher, ob es das in Tasmota gibt. Nach dem Motto:


    const obj = JSON.parse(response.body)

    pwr=obj.Power

    Danke gemu2015, hat aber leider auch nicht geholfen.

    Unten habe ich den Inhalt von pwr ausdrucken lassen: ???

    11:35:00.678 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2023-02-08T11:35:01","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":80.373,"Yesterday":2.185,"Today":1.541,"Power":368,"ApparentPower":368,"ReactivePower":0,"Factor":1.00,"Voltage":235,"Current":1.569}}}}

    11:35:00.682 RSL: RESULT = {"WebQuery":"Done"}

    11:35:00.686 pwr ???

    Ok, danke für die Tipps!

    Seltsamerweise habe ich für die Gosund SP1 keinen Benutzer oder Passwort festgelegt und in Firefox nimmt er den String ohne Probleme und liefert den Result.

    Mit =>Webquery funktioniert es im Script aber sehr gut. Mit vordefiniertem #define Use_Websend_Result während des Kompilierens bekomme ich sogar ein Result geliefert, wie es bei =>Websend zu erwarten gewesen wäre (siehe oben).

    Jetzt würde ich nur noch gerne den Result auswerten. gemu2015 hat ja einen Vorschlag gemacht, aber die Variable wird nicht befüllt.

    Die Frage ist, ob die Abteilung >E im Script unterhalb von >S sitzen muss, wo WebQuery abgefragt wird, oder ob die Webquery Abfrage direkt oberhalb in >E, also über pwr=ENERGY#Power eingegeben werden muss.

    Ich probiere heute noch ein Bischen, bin aber natürlich für jeden Tip dankbar.

    Hm, ich habe #define USE_WEBSEND_RESPONSE

    nun eingebunden, die anderen Websend Befehle im Script bekommen eine Super Response, nur zum Gosund SP1:


    17:04:24.418 Script: performs "Websend [http://192.168.7.161]/cm?cmnd=Status 10"

    17:04:29.650 RSL: RESULT = {"WebSend":"Connect failed"}

    So geht es mit allen Tasmota Geräten.


    Über WebQuery bekomme ich Results aber die werden anscheinend anders als Websend Results von der Response Definiton nicht mit abgedeckt:

    20:41:07.402 Script: performs "WebQuery http://192.168.7.161/cm?cmnd=Status+8 GET"

    20:41:07.694 RSL: RESULT = {"WebQuery":{"StatusSNS":{"Time":"2023-02-07T20:41:07","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":78.830,"Yesterday":1.436,"Today":2.184,"Power":0,"ApparentPower":12,"ReactivePower":12,"Factor":0.02,"Voltage":233,"Current":0.052}}}}

    20:41:07.699 RSL: RESULT = {"WebQuery":"Done"}

    Ja genau, konkret habe ich einen Lesekopf für meinem Stromzähler, der mit Tasmota läuft und über Tasmota Script schon vieles kann und dann die Daten vom Gosund SP1 anfordern soll.

    Ich dachte an eine Zeile in der Art:

    fetch http://192.168.7.161/cm?cmnd=Status%2010 , verarbeite weiter mit json.parse und schreibe den Wert von "Power" in die Variable aktpwr. Mit der Variable würde ich dann gerne weiter rechnen, oder sie zumindest in der WebUI darstellen.

    Hallo miteinander und speziell HoerMirAuf,

    ich hänge da fest wo das schöne JavaScript mit der fetch Funktion in ein Tasmota Script eingebunden werden kann.

    Konkret hätte ich gerne den aktuellen Verbrauch meiner Tasmota Gosund Sp1 abgefragt und in eine Variable auf einem anderen Tasmotagerät geschrieben.

    Tasmota habe ich auf dem "Empfänger" erfolgreich mit CORS kompiliert. Die SP1 läßt sich über Firefox mit dem Aufruf von http://192.168.7.161/cm?cmnd=Status%2010 mit allen relevanten Werten abfragen und liefert dann

    Code
    {"StatusSNS":{"Time":"2023-02-07T15:08:53","ENERGY":{"TotalStartTime":"2022-10-31T18:33:35","Total":78.518,"Yesterday":1.436,"Today":1.872,"Power":236,"ApparentPower":236,"ReactivePower":0,"Factor":1.00,"Voltage":234,"Current":1.007}}}

    Dort bräucht ich den Wert "Power", der im Beispiel 236 Watt beträgt.

    Über die genaue Syntax und Stelle in Tasmota Script (nicht Berry, da ESP 8266) wäre ich sehr erfreut.

    Wenn man bremst, lädt man ja auch in winzigen Mengen... nennt sich Rekuperation. Der Go e charger gemini wurde speziell für das einphasige Überschussladen entwickelt. Der Schütz unterstützt 50.000 Schaltzyklen. Wenn ich durchschnittlich jeden Tag 6x schalte wären das 22,831 Jahre Schaltleistung.

    Jetzt lass mal die Kirche im Dorf. Viel Erfolg bei deiner Lösung über die Go e Charger App.

    So ähnlich ist es. Der Strom wird aber erst beim nächsten Start ("das Spiel geht von vorne los") wieder auf 6A gesetzt. Die für meinen Bedarf zugeschnittene Lösung lässt sich auch an Minus-Werte anpassen z.B. pcurr<-200. Die Hauptsache ist, dass die saldierte Zählerleistung zu Grunde gelegt wird. Und dafür nimmt man einen optischen Lesekopf für die Info-Schnittstelle (die mit Abstand komfortabelste und günstigste Möglichkeit) oder baut sich einen Shelly 3EM in den Schrank, das kostet aber. Hier gibt es dann auch IO Steuerungsmöglichkeiten. Das war für mich aber wegen der gewünschten Kaskadierung nicht umsetzbar und auch deshalb, weil ich keinen Server wie die Shelly-Cloud oder den IOBroker zwischenschalten wollte. Für 30€ eine Steuerung in einem so winzigen Teil, das finde ich toll.

    Mein Zähler misst nur den Gesamtverbrauch (1.8.0) und kann nicht unter den Wert 0 Watt fallen.

    Im ersten Schritt wird also überprüft, ob der aktuelle Verbrauch kleiner 1 ist. Dann startet das Laden mit 6A und 1 Phase. Das Limit wird nun von 99999 Watt auf 1450 Watt umgestellt (das sind etwa 70 Watt mehr als die theoretischen 1380 Watt -> Puffer). Liegt bei der nächsten Überprüfung der Wert wieder bei <1 Watt dann wird der Strom auf 7A hochgesetzt und das Limit wird weiter hochgesetzt usw. Das kann dann bis 32A und drei Phasen (also 22 KW) fortgeführt werden.

    Wird aber das Limit, egal auf welcher Stufe, überschritten, wird cnt1=0 und plim1=99999 gesetzt und das Laden mit alw=0 beendet, was einem Reset auf den Scriptstart entspricht und das Warten auf pcurr<1 geht wieder los.

    An sonnigen Tagen läd das Auto fast den ganzen Tag, aber auf jeden Fall solange bis mein Sohn aus der Schule kommt und die Playstation eingeschaltet wird :) . Wird zwischendurch mit meinem 2. Go e Charger geladen (3 E-Autos vorhanden) schaltet aufgrund des Limits die Ladung am 1. Go E Charger wieder aus und wartet, dass der Verbrauch wieder <1 Watt fällt.

    Meine Go E Charger sind ständig eingeschaltet und können so sehr schnell zum Laden übergehen (<5 Sekunden).

    Richtig Sinn macht die Lösung eigentlich dann, wenn mehr Sonnenstunden zur Verfügung stehen, da sonst zuviel Strom vom Netzbetreiber bezogen werden muss (z.B. PV-Leistung 300 Watt, Auto läd aber mit 1380 Watt, Differenz 1 KW wird dabei vom Netzbetreiber bezogen).

    Leider ist ja bei E-Autos keine Ladung mit einer Phase unter 6A möglich, deswegen werde ich mir noch einen Heizstab in meinen Warmwasserspeicher einsetzen und den so lange beheizen bis ein Wert von ca. 700 Watt überschritten wird. Dann kommt das Auto dran. Das ist auch für Urlaub etc. gut.

    Schäden am Go e Charger oder Auto befürchte ich nicht. Die Limits können ja entsprechend hochgesetzt werden, so dass das Laden in jedem Fall mindestens 5 Minuten dauert (ist bei mir aktuell jetzt schon der Fall, siehe auch die Bilder, hier wurden schon bei bewölktem Himmel 20 Minuten geladen).

    Das schöne an der Lösung ist, dass kein separater Server nötig ist (alles läuft über den optischen Lesekopf und Tasmota Script). Das macht den IOBroker unnötig.

    Liebe CreationX User,

    Überschussladen mit Hilfe von Tasmota, einem Wifi - Lesekopf (Ebay) für die optische Info-Schnittstelle meiner "Modernen" Messeinrichtung und einem Go e Charger Gemini funktioniert mit dem Tasmota Script weiter unten.

    Vorhanden ist:

    PV Anlage 2,7 kwp, Go e Charger Gemini, VW ID.4 77 KWH, Moderne Messeinrichtung DWS 7612.1, Tasmota Lesekopf

    Mein Ansatz:

    Laden, wenn Überschuss vorhanden und mit an die Leistung der PV-Anlage angepasstem Strom. Das heisst, möglichst nur mit einer Phase laden und mit Stromstärken zwischen 6A und 12A.

    Glücklicherweise kann ja der Gemini eine softwareseitige Umschaltung zwischen 1 und 3 Phasen und zwischen 6 und 16A(32A) mit API-Befehlen, die über den Tasmota Script Befehl "Websend" übermittelt werden können. Auch das Laden erlauben oder verbieten klappt so. Habt ihr sinnvolle Ergänzungen? Dann gerne in den Kommentaren!

    Meine Kommentare bitte vor Inbetriebnahme des Codes löschen.

    Code:

    >D

    plim1=99999 ; soll ein hoher Wert sein, falls tagsüber normal geladen werden soll, stellt das obere Limit dar, bei dem die Ladung abgeschaltet wird

    cnt1=0 ; ein Status-Variable, die es erlaubt kaskadiert den Strom hochzusetzen

    pcurr=0 ; Variable, die die aktuelle Leistung (Verbrauch) aufnimmt

    >B

    =>sensor53 r

    >T

    pcurr=Home#power ; die Variable wird mit dem aktuellen Verbrauch gefüllt

    >S

    if time>sunrise ; das Script soll nur zwischen Sonnenaufgang und Untergang ausgeführt werden

    and

    time<sunset

    then

    if upsecs%10==0 ; Wartezeit, damit der Sensor auch ausgelesen wird

    then

    print Zeit: %time% ;Statusmeldungen für die Konsole, können gelöscht werden

    print Sonnenaufgang: %sunrise%

    print Sonnenuntergang: %sunset%

    print akt Leistung: %pcurr%

    print akt Status: %cnt1%

    print akt Limit: %plim1%

    if pcurr<1 ;Wenn der Verbrauch kleiner als 1 Watt ist

    then

    if cnt1==6

    then

    =>WebSend [192.168.7.128/mqtt?payload=amx=12] ; Konfiguration auf 12 Ampere

    cnt1=7

    plim1=2800

    endif

    if cnt1==5

    then

    =>WebSend [192.168.7.128/mqtt?payload=amx=11]

    cnt1=6

    plim1=2600

    endif

    if cnt1==4

    then

    =>WebSend [192.168.7.128/mqtt?payload=amx=10]

    cnt1=5

    plim1=2400

    endif

    if cnt1==3

    then

    =>WebSend [192.168.7.128/mqtt?payload=amx=9]

    cnt1=4

    plim1=2100

    endif

    if cnt1==2

    then

    =>WebSend [192.168.7.128/mqtt?payload=amx=8]

    cnt1=3

    plim1=1900

    endif

    if cnt1==1

    then

    =>WebSend [192.168.7.128/mqtt?payload=amx=7]

    cnt1=2

    plim1=1700

    endif

    if cnt1==0

    then

    =>WebSend [192.168.7.128/mqtt?payload=fsp=1] ; Umschalten auf eine Phase

    =>WebSend [192.168.7.128/mqtt?payload=amx=6] ;Umschalten auf 6A

    =>WebSend [192.168.7.128/mqtt?payload=alw=1] ; Laden erlauben

    cnt1=1

    plim1=1450

    endif

    endif

    if pcurr>plim1; Wenn der Verbrauch höher ist als das Ladelimit

    then

    =>WebSend [192.168.7.128]/mqtt?payload=alw=0 ; Laden verbieten, da der Verbrauch des Haushalts Vorrang hat, [die Klammer sitzt richtig]

    cnt1=0

    plim1=99999

    endif

    endif

    endif

    >M 1 ; hier die Zählerdaten zum Auslesen meines Zählers, ich musste am Zähler selbst Info auf ON und Pin auf OFF stellen

    +1,3,s,16,9600,Home

    1,77070100010800ff@1000,Energie,kWh,energy,4

    1,77070100100700ff@1,Leistung,W,power,2

    #