NEWS
[gelöst] Tankfüllung überwachen / Notaus
-
Hallo zusammen.
Ich stecke gerade bei Blockly irgendwie fest und finde leider keine passende Lösung.
Hoffe ihr könnt mir helfen.Es geht grundsätzlich um das Befüllen eines Tanks zur Gartenbewässerung. Diese Bewässerung habe ich schon mit IO-Broker automatisiert. [https://forum.iobroker.net/topic/24321/gartenbewässerung-füllstand-tank](Wer nachlesen möchte)
Die Automatik zum Befüllen funktioniert soweit auch gut. Es soll bei weniger als 1000l Inhalt ein Ventil aufgehen und bei 2500l Inhalt wieder zu.
Allerdings ist es so, dass der verbaute Wemos anscheinend manchmal spinnt und keine Werte mehr liefert und dadurch der Tank überläuft wenn er kein Signal bringt, dass der gewünschte Füllstand erreicht ist.
Daher dachte ich mir, ich baue so etwas wie eine "Not"-Abschaltung ein. Als Beispiel einfach mal:
Das Signal Füllstand < 1000 kommt und Wemos geht nach 500l Füllung offline. Dann kommt kein Signal mehr um die Füllung abzuschalten.
Ich habe jetzt versucht mit Timeout eine Abschaltung zu erzwingen, aber das scheint auch nicht richtig zu funktionieren.
Hier mal mein Versuch
Ich vergleiche den Füllstand mit einer Variablen, die sich eine Sekunde nach jeder Änderung des aktuellen Tankinhaltes auf eben diesen aktuellen Tankinhalt aktualisiert. Ich vergleiche also den aktuellen mit dem vorigen Wert und aktualisiere diese Variable erst eine Sekunde später, damit diese dann den letzten "aktuellen" Wert hat.
Wenn der KontrollWert <= Aktuellem Wert ist (Weil der aktuelle sich ja erhöhen sollte) soll der Timeout abgebrochen werden, sonst nicht und der "Notaus" Timer soll ablaufen und wie im Beispiel nach 10min das Ventil schliessen.
Ganz einfach gesagt: Ich möchte einen Wert vergleichen, wenn dieser sich nicht innerhalb eines bestimmten Zeitraums erhöht/verringert (weil der Wemos keine Daten mehr sendet und sich der Wert damit nicht mehr ändert) soll das Ventil mit false angesteuert werden.
Kann mir bitte jemand auf die Sprünge helfen?
-
Hallo,
vielleicht kannst Du über die Durchflussmenge/Zeiteinheit einen Zeitpunkt für Notaus berechnen? Du könntest zum Beispiel die Zeit festhalten, in der die 1500 l zulaufen. Diese Zeit würde ich nehmen, vielleicht noch 10% addieren und dann mit Zulaufbeginn den Timer starten. Läuft der Timer ab, dann das Ventil schließen. So hast Du die Gewähr, das zumindest der Countdown das Ventil schließt. Ist alles ok, dann würde der Countdown das Ventil höchstens noch einmal schließen. Ich habe mal so ein Blockly mit Countdown getestet. Sieht so aus:Das "Hauptscript" wird getriggert über den Status des Objektes (hier mal ein Thermostat, wenn es in den Boostmodus geschaltet wird). Dann startet der Timer cnt (Blocklyvariable). Der obere Teil des Scriptes zählt im Sekundentakt die 300 Sekunden runter und aktualisiert den Datenpunkt count_down (als Zahl definiert). Wenn der Timer abgelaufen ist, wird hier testweise der DP Start_300 auf false gesetzt. Vielleicht reicht Dir das als "Notaus". Den DP count_down kann man dann auch in der VIS anzeigen.
Habe mal den Export des Scripts angehängt.<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="DqZh89?2P1c|{#Kl.c:}">cnt</variable> <variable type="interval" id="Intervall">Intervall</variable> </variables> <block type="procedures_defnoreturn" id="$4!9luz@`f}qaHW,jd[~" x="38" y="63"> <field name="NAME">counter</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="comment" id="66@f%/Cjnyx-]HwB/*5#"> <field name="COMMENT">Anzeige Restzeit</field> <next> <block type="update" id="uS?Yo@_bGDaG|n?oVU9j"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.count_down</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="#_c^[d~Zd.YHUCBBMJ5D"> <field name="VAR" id="DqZh89?2P1c|{#Kl.c:}">cnt</field> </block> </value> <next> <block type="comment" id="WE,wlm3pw?DAH;6|52?V"> <field name="COMMENT">Anzeige Restzeit</field> <next> <block type="timeouts_setinterval" id="@+=G3M1P=dpeXA|;?;|y"> <field name="NAME">Intervall</field> <field name="INTERVAL">1</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="math_change" id="t|D^zBw(Kz~N=,)[s`iR"> <field name="VAR" id="DqZh89?2P1c|{#Kl.c:}">cnt</field> <value name="DELTA"> <shadow type="math_number" id="f_51T_+YcWU??8/+dJ5A"> <field name="NUM">-1</field> </shadow> </value> <next> <block type="update" id="RRs7hbJ^94I;!S*LxE5a"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.count_down</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="variables_get" id="]+)7}km@c{16/cSi`k{L"> <field name="VAR" id="DqZh89?2P1c|{#Kl.c:}">cnt</field> </block> </value> <next> <block type="controls_if" id="et,bY|$:9]NKvwjKAvfr"> <value name="IF0"> <block type="logic_compare" id="4Ww%fy7D0#?|$7?KEO:8"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="~kEXPP;4]cw#3$eoABZ+"> <field name="VAR" id="DqZh89?2P1c|{#Kl.c:}">cnt</field> </block> </value> <value name="B"> <block type="math_number" id="{X8Bf1VT(E;2.6P?I.VF"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id=";a4mJFuU%?{il@I#P!ro"> <field name="NAME">Intervall</field> <next> <block type="control" id="v6w={2e7t46q8]2)jMm|"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Start_300</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="3a-*e7[?#?CCK%{tO@gX"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> </block> <block type="on_ext" id="xX,qCotbEYAQANRG*9Ab" x="38" y="438"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">true</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="|Gb}d{Eq[c|M!QB2=TT!"> <field name="oid">hm-rpc.1.OEQ1257899.4.BOOST_MODE</field> </shadow> </value> <statement name="STATEMENT"> <block type="variables_set" id="t?=zwdkfoX[N1rj%m2uI"> <field name="VAR" id="DqZh89?2P1c|{#Kl.c:}">cnt</field> <value name="VALUE"> <block type="math_number" id="=7:R|MIKYw!Py@B76ji%"> <field name="NUM">30</field> </block> </value> <next> <block type="procedures_callnoreturn" id="4t9tb#jq4p/RRs!r}(VS"> <mutation name="counter"></mutation> </block> </next> </block> </statement> </block> </xml>
Habe das mal schnell auf meiner VIS dargestellt: coundown.mp4
Die Darstellung der Zahl ist das odometer-widget aus den hqwidgets und auf car eingestellt.
Im Video habe ich nur 10 Sekunden dargestellt, habe dann die Aufzeichnung abgebrochen. Die Anzeige geht aber bis auf 000 runter. -
Hallo.
Das ist natürlich auch ein Ansatz. Nicht ganz wie ich es mir vorgestellt habe, da ich so ja nicht mitbekomme wenn sich die Werte nicht mehr ändern, aber immerhin ein definitives Ausschalten des Zulaufs.
Das habe ich zumindest schon mal so übernommen und eingebunden. Danke Dir.Jemand noch eine Idee zum Wertevergleich?
-
@maniac sagte:
mit Timeout eine Abschaltung zu erzwingen, aber das scheint auch nicht richtig zu funktionieren.
Wenn keine Werte mehr geliefert werden, erfolgt auch kein Triggern. Ein Wertevergleich ist nicht erforderlich. Vorschlag (nicht getestet):
Wert findet man unter "Trigger".
-
@paul53 sagte in Tankfüllung überwachen / Notaus:
@maniac sagte:
mit Timeout eine Abschaltung zu erzwingen, aber das scheint auch nicht richtig zu funktionieren.
Wenn keine Werte mehr geliefert werden, erfolgt auch kein Triggern. Ein Wertevergleich ist nicht erforderlich. Vorschlag (nicht getestet):
Danke, aber mir ist noch nicht ganz klar was "Ventil" jetzt ist. Oben im ersten "Falls" ist es wohl direkt das Ventil auf/zu.
Aber was bedeutet es unten? Das ist doch eine Variable?
Welche ObjektID soll ich da einbinden/ansteuern?
Und bei "Falls Ventil" - Falls Ventil was? Also worauf wird dort abgefragt?So ganz verstehe ich es leider noch nicht.
-
@maniac sagte:
Welche ObjektID soll ich da einbinden/ansteuern?
In allen 3 Fällen ist das der Datenpunkt des Ventil-Aktors "Ventil_Frischwasser".
Und bei "Falls Ventil" - Falls Ventil was?
falls ventil entspricht falls ventil == wahr
@maniac sagte in Tankfüllung überwachen / Notaus:
Aber was bedeutet es unten? Das ist doch eine Variable?
Ja, die den gleichen Wert hat wie der Ventil-Aktor, denn der wurde unmittelbar davor mit dem Wert der Variablen gesteuert.
Die Variable ventil ist der Sollzustand des Aktors. Der Aktor wird nur gesteuert, wenn Sollzustand != Istzustand (obere falls-Abfrage), um nicht unnötige Störungen zu erzeugen.
-
@paul53 sagte in Tankfüllung überwachen / Notaus:
Ja, die den gleichen Wert hat wie der Ventil-Aktor, denn der wurde unmittelbar davor mit dem Wert der Variablen gesteuert.
Die Variable ventil ist der Sollzustand des Aktors. Der Aktor wird nur gesteuert, wenn Sollzustand != Istzustand (obere falls-Abfrage), um nicht unnötige Störungen zu erzeugen.
Jetzt habe ich es begriffen.
So scheint es jetzt im Test zu funktionieren.Vielen Dank..
-
@maniac sagte:
So scheint es jetzt im Test zu funktionieren.
Lass die Abfragen im 2-Punkt-Regler weg und mache es mit dem Telegramm besser so:
-
@paul53 sagte in Tankfüllung überwachen / Notaus:
@maniac sagte:
So scheint es jetzt im Test zu funktionieren.
Lass die Abfragen im 2-Punkt-Regler weg und mache es mit dem Telegramm besser so:
Das klappt nicht, bzw. nicht so wie geplant. Ich bekomme dann, jedesmal wenn sich der Wert ändert, eine Nachricht.
Das wird dann doch zuviel.
Abgesehen davon fliegen die Telegram eh später wieder raus.Aber danke für den Hinweis.
-
@maniac sagte:
jedesmal wenn sich der Wert ändert, eine Nachricht.
Das kann nicht sein, sondern nur, wenn Ventil Sollzustand != Istzustand.