Überschuss einer PV Anlage verwerten.
-
gnubbbel -
15. November 2020 um 21:21 -
Erledigt
-
-
-
Ups , hatte ich nicht auf dem Schirm.
Offensichtlich hört er wohl auf %te.
Danke wieder einmal!
Bei 50W Dimm/Einschaltschwelle ist dann noch Luft nach unten.
Muss dann halt die Funktion ändern.
Code
Alles anzeigen>D pcurr=0 url="[192.168.178.41]" >T pcurr=0-SML#Power_curr >S if upsecs%tper==0 then if pcurr>50 then =>WebSend %url% dimmer=(pcurr-49)/5,51 endif if pcurr>600 then =>WebSend %url% dimmer 100 endif ; meine Treiberdefinition >D >B =>sensor53 r >M 1 +1,3,s,16,9600,SML 1,77070100010800ff@1000,EVU Bezug,KWh,Total_in,4 1,77070100020800ff@1000,Einspeisung,KWh,Total_out,4 1,77070100100700ff@1,Aktueller Verbrauch,W,Power_curr,0 #
-
Konntest du es schon aktiv testen?
-
Bin gerade dabei...
Edit:
Leider nicht.. auch das Originalscript vom OW nicht..
Zum Test habe ich einen SONOFF Basic mit Tasmota geflasht und als Basic konfiguriert.
Ein (WebSend [192.168.178.41] POWER ON) schaltet das Relais - kommt also an..
Müsste pcurr vlt. als Variable gleich unter >D definiert werden?
-
das funktioniert nicht! Hinter dem Befehl müsste ein Leerzeichen und dann eine Zahl stehen ,oder eine Variable zwischen % Zeichen :
dimmer 100
dimmer %pcurr%
Noch was zum generell Vorhaben: Du schaltest bei mehr als 50W Einspeisung deinen Verbraucher mit Dimmbefehl ein,
(if pcurr>50)
1- angenommen Du hast 100W Einspeisung:
2-der dimmer bekommt den Wert (100-49)/5.51=9.2.
3-dein Verbraucher zieht jetzt 51W
4-dein nächster pcurr ist dann aber nur noch 49W, ergo Dein Script schaltet Deinen Verbraucher ab
jetzt bist Du wieder bei 1
.
oder ?
Gruss OW
-
Moin OW,
ja da mit der Syntax ist noch nicht richtig -werde ich ändern - Danke!
Die Logik hast Du schon richtig erkannt.
Nur wird das Ladegerät nicht über die Dimmer Steuerung ein oder ausgeschaltet sondern nur geregelt.
Das eigentliche An/Aus übernimmt vorher/nachher der Tasmota - Timer das brauch nicht mit ins Script.
Kleines Problem: Ich muss die Funktion wohl exponentiell gestalten, 50% entsprechen nicht 1,6V sondern eher 0,85V.
Aber mein größtes Problem ist:
Dein An/Aus Script will bei mir einfach nicht laufen.
Hier stumpf heraus kopiert, per Web in die Scriptbox von Tasmota rein kopiert und die Werte für meinen Zähler angepasst.
Mein Zähler läuft munter weiter aber sonst passiert gar nichts.
Die Schaltschwellen und auch die Negierung habe ich geändert, damit ich bei dem bisschen Licht vernünftig testen kann.
Per Konsole und WebSend kann ich das Gerät aber schalten.
Nun bin ich ratlos...
Beste Grüße
-
gnubbbel Ich weiß nicht wie dein aktuelles Skript nun aussieht. Da ist es schwer irgendetwas zu sagen.
Aber du kannst in der Konsole mit: script?VARIABLE den Wert einer Variable im Betrieb abfragen. Mit: Script>VARIABLE=12345678 kannst du einer Variablen einen Wert zuweisen.
Im Script kannst du ein: print %VARIABLE% einfügen um den Wert während des Betriebs in der Konsole ausgedruckt zu bekommen.
-
Aktuelles Script siehe Post 17. Lediglich meine Zählereinstellungen und die IP des Zielsystems hinzugefügt/ersetzt.
Code
Alles anzeigen>D pcurr=0 ;IP der S20 Steckdose url="[192.168.178.041]" >T ; positv ist einfacher pcurr=0-SML#Power_curr >S if upsecs%tper==0 then if pcurr>260 then =>WebSend %url% POWER1 ON endif if pcurr<10 then =>WebSend %url% POWER1 OFF endif endif ; Q3B Treiberdefinition >D >B =>sensor53 r >M 1 +1,3,s,16,9600,SML 1,77070100010800ff@1000,EVU Bezug,KWh,Total_in,4 1,77070100020800ff@1000,Einspeisung,KWh,Total_out,4 1,77070100100700ff@1,Aktueller Verbrauch,W,Power_curr,0 #
Damit ich es auch ohne Einspeisung heute Abend testen kann muss ich folgende Änderungen vornehmen:
Code
Alles anzeigenpcurr=0-SML#Power_curr SML#Power_curr ändern if pcurr>260 if pcurr>500 ändern if pcurr<10 if pcurr<500 ändern Ferner :Den Schalternamen =>WebSend %url% POWER1 ON in POWER ON ändern sonst fühlt sich das Ralais des Basic nicht gemeint. Das ganze kommt jetzt so drauf: >D pcurr=0 ;IP der S20 Steckdose url="[192.168.178.041]" >T ; positv ist einfacher pcurr=SML#Power_curr >S if upsecs%tper==0 then if pcurr>500 then =>WebSend %url% POWER ON endif if pcurr<500 then =>WebSend %url% POWER OFF endif endif ; Q3B Treiberdefinition >D >B =>sensor53 r >M 1 +1,3,s,16,9600,SML 1,77070100010800ff@1000,EVU Bezug,KWh,Total_in,4 1,77070100020800ff@1000,Einspeisung,KWh,Total_out,4 1,77070100100700ff@1,Aktueller Verbrauch,W,Power_curr,0 #
So gerade ausprobiert = läuft nicht
Eingabe/Ausgabe Konsole :
(21:06:58 CMD: script?pcurr)
(21:06:58 RSL: RESULT = {"script":{"pcurr":0.000000}})
-
Noch was zum generell Vorhaben: Du schaltest bei mehr als 50W Einspeisung deinen Verbraucher mit Dimmbefehl ein,
(if pcurr>50)
1- angenommen Du hast 100W Einspeisung:
2-der dimmer bekommt den Wert (100-49)/5.51=9.2.
3-dein Verbraucher zieht jetzt 51W
4-dein nächster pcurr ist dann aber nur noch 49W, ergo Dein Script schaltet Deinen Verbraucher ab
jetzt bist Du wieder bei 1
.
oder ?
Gruss OW
Verdammt, klar hast ja recht, so wird das auch nichts. Oh man, das musste ich erst dreimal lesen bevor es klick machte
Wäre aber erst mal froh Dein Originalscript zu laufen zu bekommen.
-
hier nochmal mein Script. Habe es jetzt genau so am Laufen !
Code
Alles anzeigen>D power1=0 power2=0 power3=0 pcurr=0 url1="[192.168.118.13]" >T power1=SML#Total_in power2=SML#Total_out power3=SML#Power_curr ; positv ist einfacher pcurr=0-SML#Power_curr >S if upsecs%tper==0 then =>publish q3b/Total_in %power1% =>publish q3b/Total_out %power2% =>publish q3b/Power_curr %power3% if pcurr>260 then =>WebSend %url1% POWER1 ON endif if pcurr<10 then =>WebSend %url1% POWER1 OFF endif endif ; Q3B Treiberdefinition >B =>sensor53 r >M 1 +1,3,s,0,9600,SML 1,77070100010800ff@1000,Verbrauch,KWh,Total_in,1 1,77070100020801ff@1000,Einspeisung,KWh,Total_out,1 1,77070100010700ff@1,Aktueller Verbrauch,W,Power_curr,0 #
Die power1 bis 3 Variablen kannst Du ignorieren
Zum testen einfach statt:
pcurr=0-SML#Power_curr
pcurr=SML#Power_curr
dann hast "Einspeisung"
-
kann ich eigentlich eine Variable nach einer Berechnung in einer if-then Schleife (>T) speichern und diese wieder vor dem nächsten Aufruf der Schleife wieder abrufen? Meine Versuche mit svars am Ende der Schleife führen zu keinem Erfolg. Die Variable habe ich im >D jeweils mit "p:var=0" als auch mit "var=0" probiert...
-
Vielen Dank!
Nachdem ich eine url ;auskommentiert, meine angepasst, pcurr, so wie es heute Abend notwendig eingestellt, und die Schaltschwellen auf praktische Werte eingestellt habe, wird die Variable pcurr leider immer noch nicht mit den richtigen Werten gefüttert.
-
gnubbbel Da sind immer noch die Syntax Fehler drin.
Es gibt aufgrund kein Syntax check beim tasmota scripter. (Aus Platzgründen)
Dadurch kann es manchmal vorkommen, das ein skript zwar zu speichern ist, aber ganz seltsame Fehler passieren.
Also.
Du hast 2x >D in deinem Script. Und wie bereits erwähnt sollte >B nach dem >D folgen.
>M darf am Ende stehen.
Code
Alles anzeigen>D pcurr=0 ;IP der S20 Steckdose url="[192.168.178.041]" >B =>sensor53 r tper=10 print Script gestartet. >T pcurr=SML#Power_curr >S if upsecs%tper==0 { print Akt pcurr1: %pcurr% if pcurr>500 { print Sende Power an =>WebSend %url% POWER ON } else { print Sende Power aus =>WebSend %url% POWER OFF } } >M 1 +1,3,s,16,9600,SML 1,77070100010800ff@1000,EVU Bezug,KWh,Total_in,4 1,77070100020800ff@1000,Einspeisung,KWh,Total_out,4 1,77070100100700ff@1,Aktueller Verbrauch,W,Power_curr,0 #
-
Sauber, nun läuft es
Aber das Schaltrelais wird es auf die Dauer nicht mitmachen.... es schaltet im Sekundentakt
Auch wenn ich die Last abhänge.
Ist da noch was mit der Else?
Code
Alles anzeigen23:55:17 Script: performs "WebSend [192.168.178.041] POWER ON" 23:55:17 RSL: RESULT = {"WebSend":"Done"} 23:55:17 Sende Power aus 23:55:17 Script: performs "WebSend [192.168.178.041] POWER OFF" 23:55:17 RSL: RESULT = {"WebSend":"Done"} 23:55:17 Sende Power an 23:55:17 Script: performs "WebSend [192.168.178.041] POWER ON" 23:55:18 RSL: RESULT = {"WebSend":"Done"} 23:55:18 Sende Power aus 23:55:18 Script: performs "WebSend [192.168.178.041] POWER OFF" 23:55:18 RSL: RESULT = {"WebSend":"Done"} 23:55:18 Sende Power an 23:55:18 Script: performs "WebSend [192.168.178.041] POWER ON" 23:55:18 RSL: RESULT = {"WebSend":"Done"} 23:55:18 Sende Power aus 23:55:18 Script: performs "WebSend [192.168.178.041] POWER OFF" 23:55:19 RSL: RESULT = {"WebSend":"Done"}
-
Ich weiß nicht genau worauf du hinaus möchtest. Kannst du das evtl. noch etwas genauer erklären?
Generell musst du mit den p: Variablen aufpassen. Du solltest sie nicht ständig neu beschreiben. Das führt zur schnellen abnutzung deines Flash Speichers.
Die >T Sektion wurde irgendwann mal geändert. Soweit ich weiß, wird diese nicht mehr wie früher alle teleperiode aufgerufen sondern alle 200ms o.Ä. Meine ich zumindest.
Es lassen sich in der >T Sektion auch keine Werte berechnen soweit ich weiß dient sie nur dazu die MQTT Werte in Variablen zu speichern.
-
gnubbbel Ich glaub das Else darf nicht in einer neuen Reihe stehen. ändere es mal zu: } else {
-
um mal hier am Beispiel zu bleiben:
wenn die Einspeisung grösser als Schwellwert ist, dann setzte Power für Heizstab aus momentaner Einspeisung minus Schwellwert
if pcurr>20
then pheizstab=pcurr-20
wenn ich das so lasse, wird ja die Einspeisung pcurr beim nächsten Aufruf der Schleife ja um die Leistung des Heizstabes kleiner (wenn der an ist).
Somit müsste ich für den Wert für die Power des Heizstabes den beim nächsten Aufruf mit einrechnen resp. abziehen. Und genau hier müsste ich m.M. nach den Wert des letzten Wertes speichern um den beim nächsten Aufruf zu haben? Ich hoffe, verständlich?
Wie würdest Du das machen?
Gruss OW
-
Moin OW,
Dein Script läuft.
Muss ja auch wenn es bei Dir auch läuft.
Weis nicht was gestern Abend schief lief.
BTW. Willst Du Deinen Strom verheizen? Geht Deine Anlage aus der EEG?
Beste Grüße
-
wenn pcurr und pheizst eine Angabe in Watt ist, dann vielleicht so:
Code
Alles anzeigen>D ;debug ein/aus debug=1 ;vars curr=0 pheiz=0 cnt1=0 cnt2=0 ;schwellwert 20, verzögerung 5 sw=20 vz=5 >S if pheiz<=0 and curr>sw{ pheiz=curr-sw print Aller erster fall } if pheiz>=sw and curr-sw>sw and cnt1>vz{ pheiz=pheiz+curr-sw cnt1=0 } if pheiz>=sw and curr-sw>sw{ print cnt1 up cnt1=cnt1+1 }else{ print cnt1 reset cnt1=0 } if pheiz>=sw and curr-sw<sw and curr<0 and cnt2>vz{ pheiz=pheiz+curr cnt2=0 } if pheiz>=sw and curr-sw<sw and curr<0{ print cnt up cnt2=cnt2+1 }else{ print cnt2 reset cnt2=0 } if pheiz<0{ pheiz=0 } if debug>0 { print print ----------------------------- print Akt. Curr: %1curr% print pheiz: %1pheiz% print cnt1: %0cnt1% print cnt2: %0cnt2% print ----------------------------- print }
Das Skript rechnet immer in Abhängigkeit von deiner pcurr. (bei mir nur curr)
Ich bin nun, aufgrund fehlender Infos von einer PVanlage ausgegangen.
Am einfachsten wäre es übrigens wenn die Werte einzeln vorliegen würden. Also das was PV Produziert und das was der Haushalt verbraucht.
Das würde einiges erleichtern denke ich.
Jedenfalls. Wenn also Curr in den Minus-Bereich wechselt, wird die differenz vom pheizs abgezogen. Damit der heizst. nicht ständig angepasst wird habe ich eine verzögerung von 5sek eingebaut.
Kannst dir ja mal anschauen.
-
Heiße zwar nicht sunburstc..
"if pcurr>20
then pheizstab=pcurr-20"
Meine Gedanken..
pcurr=SML#Power_curr ------ nur zum Beispiel alles positive Werte. Der Wert kommt mit jedem Durchgang neu.
if pcurr>20 ---- Problem= Wir benutzen diesen Wert auch als Regelwert.
Zwacken wir uns ab hier von diesen =21W, weil ganzzahlig ,etwas ab ist die Bedingung im nächsten Durchgang schon wieder nicht erfüllt.
then pcurr = pcurr+19 um ein Verbrauchs Puffer zu bekommen. 40W--------
--------pheizstab=pcurr-21 mindestens 20W sollen ja über bleiben
WebSend ***** oder dimmer %pheizstab%
else
WebSend **** dimmer %0%
Ist mein obiges Geschreibsel gedankenrichtig?
-