NEWS
Blockly: Anhebung der Warmwassertemperatur bei PV_Überschuss
-
Du hast die "interne" Verzögerung im steuere-Block verwendet, nicht dass du da mehrere Verzögerungen aufrufts und die dann dieses Verhalten provozieren.
Probiere doch mal stattdessen timeout-Blöcke zu verwenden und diese dann auch an den richtigen Stellen wieder beenden.
Ich würde jetzt grob sagen, einen timeout-Block um "steuere Einspeisung unwahr" dann gleich darunter, in den Timeout ein timeout-beenden und dann noch einen timeout-beenden Block bei "steuere Einspeisung wahr".
Enrico
-
Hi Enrico,
kannst du mir mal auf die Sprünge helfen wie du das meinst?
Ich habe da noch ein Verständnis Problem :oops:
Danke
Mirko
-
Dein zweiter Trigger (Wirkenergie_Bezug > 500) setzt jedesmal einen State verzögert, wenn er ausgelöst wird. Eine mehrfache Änderung der Wirkenergie jenseits von 500 sorgt nun dafür, dass jeweils 30s nach dieser Änderung der State Einspeisung_3800 gesetzt wird, auch wenn dies gar nicht mehr nötig und sinnvoll ist. Du fängst das zwar eigentlich ab, aber möglicherweise verwirrt der mehrfache Timeout irgendwas.
Enricos Vorschlag sieht wie folgt aus (in Pseudocode):
Wenn Wirkenergie_Bezug > 500: timeout1 löschen timeout1 erstellen mit 30s Verzögerung: Einspeisung_3800 auf unwahr setzen Wenn Wirkenergie_Einspeisung > 3800: timeout1 löschen (damit die Variable nicht unnötig mit unwahr überschrieben wird) Einspeisung_3800 auf wahr setzen Rest wie gehabt
-
OK.
Meint ihr so!?
-
So in etwa, bin mir jetzt nicht ganz sicher bei dem unteren Stop, ob so, wie du den gelegt hast, oder in den timeout rein nach dem steuere.
Auf jeden Fall sollte der timeout so immer sicher beendet werden. Probiers doch mal aus.
Enrico
-
So hat es nicht funktioniert. Bei Bezug >500 wurde nicht wieder auf "unwahr" gewechselt.
Habe es mal so geändert:
Das erste steuere nur um nach Script neustart den DP sicher auf false zu setzen.
Jetzt mal ein paar Wolken abwarten.
-
Du hast bei 500 auch ein größer als drin, dann klappt das nicht. Entweder machst du da ein kleiner als rein, oder du verwendest als Hysterese einen Wert von vielleicht kleiner als 1500 dann würde das Abschalten der Erwärmung auch wieder Sinn machen.
Enrico
-
Hi Enrico,
Kann es sein das du was verwechselt? Bei den >500 schaue ich ja auf den Bezug (vom Netzbetreiber) und bei den >3800 auf meine Einspeisung. Oder habe ich noch einen Gedanken Fehler.
Mirko
-
Hast Recht, ich hab mich da verwirren lassen! :?
Enrico
-
Setz doch mal noch zwei debug-Blöcke ein. Einen in den timeout und einen einen unter falls (beim unteren Teil) um zu sehen, was bzw. ob da was passiert. Kannst du denn ausschließen, dass die Einspeisung in den 30sec timeout nicht wieder über 3800 gegangen ist? Wenn nicht, du weißt ja, debug-Blöcke wirken manchmal Wunder!
Enrico
-
Gute Idee. Werde ich morgen machen.
Die 30sekunden sind jetzt nur zum testen. Will das eigentlich so auf 5 Minuten stellen damit das nicht hin und her schaltet.
Gesendet von iPhone mit Tapatalk Pro
-
Hallo wendy2702
In Deinem Blockly oben, hättest Du bei den Verzögerungen, eigentlich nur ein Häkchen bei "löschen falls lauft" setzen müssen.
Grüße
-
Damit kannst du den Timer aber nicht stoppen, wenn der obere Trigger reagiert, oder sehe ich das falsch?
Enrico
-
Damit kannst du den Timer aber nicht stoppen, wenn der obere Trigger reagiert, oder sehe ich das falsch? `
Ich meinte dieses Blockly viewtopic.php?p=157237#p156903
So im "Überflug" sehe ich da keine Zusammenhänge der Verzögerungen.
Grüße
-
Die Verzögerungen sollen verhindern, das bei kurzem Wolkendurchzug immer wieder hin- und hergeschaltet wird.
Der Zusammenhang ist in dem Fall die Variable, die mit dem einen Trigger auf wahr und mit dem anderen auf unwahr geschaltet werden soll.
Enrico
-
Hi,
Danke das ihr euch meinem Problem annehmt!
Richtig, mit den/der Verzögerung wollte ich das hin und her schalten verhindern wenn mal kurz ne Wolke kommt.
Eigentlich hätte ich es irgendwann gerne so das der Wert Einspeisung z.B. Für 3 minuten größer als 3800 ist und dann erst die Variable auf „true“ gesetzt wird und damit WW Temperatur auf 60 Grad.
Andersherum dann wenn der Wert für Bezug z.B: länger als 4 Minuten >500 die variable wieder auf „false“ und damit WW Temperatur auf 45 Grad.
Kann ich das mit Timeout / Verzögerungen erreichen oder erfordert das komplexere Programmierung?
Danke und Gruß
Mirko
-
Das sollte per einfachen Timeouts gehen, bin mir aber nicht sicher wie man das Überprüfen auf existierenden Timeout per Blockly macht. Eventuell musst du doch auf JS zurückgreifen:
Trigger Einspeisung > 3800: Wenn timeout1 nicht läuft UND Variable == true: setze timeout1 (3 Minuten): (optional: Wenn Einspeisung immer noch > 3800 => ) Variable auf false Trigger Einspeisung < = 3800: Lösche Timeout1 Trigger Bezug > 500: Wenn timeout2 nicht läuft UND Variable == false: setze timeout2 (4 Minuten): (optional: Wenn Bezug immer noch > 500 => ) Variable auf true Trigger Bezug <= 500: Lösche timeout 2
-
Danke.
Wie man einen laufenden Timer prüft weiß ich weder in Blockly noch in JS :mrgreen: :roll:
Verstehe ich das richtig das bei einem Timeout auch nach/während Ablauf des Timeouts nochmal geschaut wird ob die Bedingung erfüllt wird?
-
Wie man einen laufenden Timer prüft weiß ich weder in Blockly noch in JS :mrgreen: :roll: `
Bei Blockly geht das leider nur "von-hinten-durch-die-Brust-ins-Auge".Aber es geht mit Hilfsvariablen und Funktionen.
Das Prinzip sieht so aus.
!
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_if" id="1`C*nVG*,{-|Lp?VmSwx" x="-462" y="88"><mutation else="1"></mutation> <value name="IF0"><block type="logic_compare" id="Plk9G8)TLiPXC@eABo_C"><field name="OP">EQ</field> <value name="A"><block type="variables_get" id="+5X]9~{)G=:u.i(=A!r?"><field name="VAR">Timer1_run</field></block></value> <value name="B"><block type="logic_boolean" id="B?J7s{_=*DYG1=a|Z`*X"><field name="BOOL">TRUE</field></block></value></block></value> <statement name="DO0"><block type="procedures_callnoreturn" id="Xt;tr~EEGP7Z!qY/_,*="><mutation name="Timer1_aus"></mutation></block></statement> <statement name="ELSE"><block type="procedures_callnoreturn" id="@TNnC-{V5eFmpW1M#6I]"><mutation name="Timer1_an"></mutation></block></statement></block> <block type="procedures_defnoreturn" id="rr(PCWc?1ajHH/.cj=dP" x="-662" y="213"><field name="NAME">Timer1_an</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"><block type="comment" id="6Wiz2h{]@5Qt~dZeq/1c"><field name="COMMENT">Nicht unbediengt notwendig</field> <next><block type="comment" id="*B#%vZhKWB#YvyWGb@_8"><field name="COMMENT">aber zur Sicherheit vorher stoppen</field> <next><block type="procedures_callnoreturn" id="Ic_aL)K0]jz2|(9dCaAi"><mutation name="Timer1_aus"></mutation> <next><block type="comment" id="+2h2v5.9*tq{X[og(Jt:"><field name="COMMENT">Hier Timer starten</field> <next><block type="variables_set" id="VAOo8~nNu.wCN,f#_-.v"><field name="VAR">Timer1_run</field> <value name="VALUE"><block type="logic_boolean" id="#ziRr0t*:Tgk#;KIdJHs"><field name="BOOL">TRUE</field></block></value> <next><block type="timeouts_settimeout" id=".MiD.cWd79}v-vvIkfW*"><field name="NAME">Timer1</field> <field name="DELAY">1000</field> <field name="UNIT">ms</field> <statement name="STATEMENT"><block type="comment" id="rTm5sz;*zDYM[3A?WQZX"><field name="COMMENT">Hier irgendwas machen</field> <next><block type="comment" id="g,x3tK[DUIw+#u6,S!L-"><field name="COMMENT">Danach die die Timer Hilfsvariable auf unwahr</field> <next><block type="variables_set" id="nDg,=+3j|+u}r%mES%Oc"><field name="VAR">Timer1_run</field> <value name="VALUE"><block type="logic_boolean" id="cMECEt0RqU-o5N|uq.WK"><field name="BOOL">FALSE</field></block></value> <next><block type="comment" id="qC1UF]Y6BmOxU(8Gy[)v"><field name="COMMENT">ACHTUNG!!!!!!!</field> <next><block type="comment" id="idALyk(O6L4;7Z#,)4lu"><field name="COMMENT">Dieser innere Teil des Timers wird NICHT</field> <next><block type="comment" id="rs%y:7?bmTYs3dD:AYj?"><field name="COMMENT">ausgeführt wenn der Timer von "aussen"</field> <next><block type="comment" id="wdC+0L;(Uf^Ees{GtRy/"><field name="COMMENT">gestoppt wird.</field> <next><block type="comment" id="vJ@bN3v7UO;d#3VpPjcl"><field name="COMMENT">Deshalb alles in Funktionen packen!</field></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></next></block></statement></block> <block type="procedures_defnoreturn" id="MlKJiSJ?rI=ucz^r9BWt" x="-262" y="263"><field name="NAME">Timer1_aus</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"><block type="comment" id=",!NuTDD5kay3}E{OA)@_"><field name="COMMENT">Timer stoppen und Hilfsvariable auf false</field> <next><block type="timeouts_cleartimeout" id="7*IIi^GXEuB0x3kLF|l8"><field name="NAME">Timer1</field> <next><block type="variables_set" id="49xT4jIbI_FW|=,g|=Yq"><field name="VAR">Timer1_run</field> <value name="VALUE"><block type="logic_boolean" id="tIBJ3x9-s@UPoQ|Yv~to"><field name="BOOL">FALSE</field></block></value></block></next></block></next></block></statement></block></xml> !
Grüße
-
:shock:
Danke!
Aber an welche Stelle käme den jetzt da was von meinem Script rein?
Müsste ich hier
Meine Abfrage z.B. der Einspeisung einfügen ?
Sorry… ich überblicke das Gesamtkonzept irgendwie noch nicht. :oops: