NEWS
[gelöst] Hilfe bei zeitsteuerung
-
@Aphofis
Vorschlag (nur 1. von 4 Uhrzeiten dargestellt): -
@paul53
Oh Mann woher weißt du sowas alles !?
Ich werde das mal integrieren und testen
Vielen Dank! -
Wenn du so Fit bist im Blockly wäre mir ein Riesen Projekt wichtig !?
Kannst du da nicht mal drüber gucken ob du eine Idee hast wie man das realisieren kann!?
Da es die letzte große Sache ist die ich noch integrieren möchte. -
Ist das so korrekt?
<xml xmlns="http://www.w3.org/1999/xhtml"> <variables> <variable type="" id="u5iug_dP{RWS.8r9[r{%">Dauer</variable> <variable type="" id="Q7*Gw)fesXb}OUBj1{`;">Uhrzeit_1</variable> <variable type="undefined" id="Intervall">Intervall</variable> <variable type="undefined" id="schedule_1">schedule_1</variable> </variables> <block type="procedures_defnoreturn" id="jE$gVVpa7!Xtx{X@H^Fd" x="-737" y="-762"> <field name="NAME">Futter</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="variables_set" id="9kptcK|P^2:}bKZXyZ8f"> <field name="VAR" id="u5iug_dP{RWS.8r9[r{%" variabletype="">Dauer</field> <value name="VALUE"> <block type="get_value" id=".,XzJi)h(f$9$~(`H$I!"> <field name="ATTR">val</field> <field name="OID">Aqua_Control.0.Futterautomatik_multiplikator</field> </block> </value> <next> <block type="control" id="%}iPzHc5tUi.(P1_MvRo"> <mutation delay_input="false"></mutation> <field name="OID">rpi2.0.gpio.25.state</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="SM.e~4#O=p?c/SXA|JX%"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="comment" id="KV;?nPX*TAluqR-qF9f+"> <field name="COMMENT">Intervalldauer = Faktor</field> <next> <block type="timeouts_setinterval" id="1+dIQ5^rJM?nkaI[6WN}"> <field name="NAME">Intervall</field> <field name="INTERVAL">800</field> <field name="UNIT">ms</field> <statement name="STATEMENT"> <block type="math_change" id="!*zN$DgW0K=76_[.1*]X"> <field name="VAR" id="u5iug_dP{RWS.8r9[r{%" variabletype="">Dauer</field> <value name="DELTA"> <shadow type="math_number" id="e_D7=bSd65:`]Q{qWSZD"> <field name="NUM">-1</field> </shadow> </value> <next> <block type="controls_if" id="=/[;A-M~WF?KXEx~W0z?"> <value name="IF0"> <block type="logic_compare" id=";qY,PC)CB~{1#4iVHaj,"> <field name="OP">LTE</field> <value name="A"> <block type="variables_get" id="2k;4KgTu$A3wF)@V`ulP"> <field name="VAR" id="u5iug_dP{RWS.8r9[r{%" variabletype="">Dauer</field> </block> </value> <value name="B"> <block type="math_number" id="?bnhw6qVm`$}~NCKlw2P"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="timeouts_clearinterval" id=";dz/hf`o4]4(2pDSH)I3"> <field name="NAME">Intervall</field> </block> </statement> <next> <block type="control" id="SeaFI}%xNdyzRbLV,6HN"> <mutation delay_input="false"></mutation> <field name="OID">rpi2.0.gpio.25.state</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="1_[)-;0}n;LMH}tCmhi:"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> </block> <block type="comment" id="g{Y%*~I{x`_l;*~`c*Fr" x="-717" y="-405"> <field name="COMMENT">1. Uhrzeit hh:mm</field> <next> <block type="on_ext" id="}BTi=~h~RiZ;@8S.a_*{"> <mutation items="1"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="6R*wwsh+EjXJ1d`_3hxv"> <field name="oid">default</field> </shadow> </value> <statement name="STATEMENT"> <block type="variables_set" id="{M}nz9j/hOc[/j9R0[zd"> <field name="VAR" id="Q7*Gw)fesXb}OUBj1{`;" variabletype="">Uhrzeit_1</field> <value name="VALUE"> <block type="lists_split" id="g,gp5[yex~P:LF-[.*(("> <mutation mode="SPLIT"></mutation> <field name="MODE">SPLIT</field> <value name="INPUT"> <block type="on_source" id="Pyx^=nsIZs@M|nbNaAiW"> <field name="ATTR">state.val</field> </block> </value> <value name="DELIM"> <shadow type="text" id="OEq|yeHMb*DILCJQAnkd"> <field name="TEXT">:</field> </shadow> </value> </block> </value> <next> <block type="schedule_clear" id="O0@)[PTM_!LiaM@04{V#"> <field name="NAME">schedule_1</field> <next> <block type="schedule_create" id="6x%+6G+PaD[w*{FuFm=K"> <field name="NAME">schedule_1</field> <value name="SCHEDULE"> <shadow type="field_cron" id="m4F75|F$}NA}2;e/avWa"> <field name="CRON">* * * * *</field> </shadow> <block type="cron_builder" id="q6(U2T{7uu}mYF)9QMKr"> <mutation seconds="false" as_line="false"></mutation> <field name="LINE">FALSE</field> <field name="WITH_SECONDS">FALSE</field> <value name="DOW"> <shadow type="text" id=")8oVcqHY5re?jv#0QsO8"> <field name="TEXT">*</field> </shadow> </value> <value name="MONTHS"> <shadow type="text" id="GfQ!DoE|TZTliq*)8,@j"> <field name="TEXT">*</field> </shadow> </value> <value name="DAYS"> <shadow type="text" id="S6hVuxIjcYJMlS^~:zE5"> <field name="TEXT">*</field> </shadow> </value> <value name="HOURS"> <shadow type="text" id="NP{*G*@dWEP9M9mNlZFF"> <field name="TEXT">*</field> </shadow> <block type="lists_getIndex" id="-0gZ}|H=8/}~St}d%rl;"> <mutation statement="false" at="true"></mutation> <field name="MODE">GET</field> <field name="WHERE">FROM_START</field> <value name="VALUE"> <block type="variables_get" id="8U#M]$`MHq(~A]~(v{2R"> <field name="VAR" id="Q7*Gw)fesXb}OUBj1{`;" variabletype="">Uhrzeit_1</field> </block> </value> <value name="AT"> <block type="math_number" id=")zFTxG~Gpp`eZw8r2,8w"> <field name="NUM">1</field> </block> </value> </block> </value> <value name="MINUTES"> <shadow type="text" id="I(LCmtz/NJ%:Tvp,*;JL"> <field name="TEXT">*</field> </shadow> <block type="lists_getIndex" id="0([.HRKLsVPA.X:jwVI@"> <mutation statement="false" at="true"></mutation> <field name="MODE">GET</field> <field name="WHERE">FROM_START</field> <value name="VALUE"> <block type="variables_get" id="8#E0pY-UET(BcZH]~qB:"> <field name="VAR" id="Q7*Gw)fesXb}OUBj1{`;" variabletype="">Uhrzeit_1</field> </block> </value> <value name="AT"> <block type="math_number" id=";UF-jK:^cV#hui?GDL/V"> <field name="NUM">2</field> </block> </value> </block> </value> </block> </value> <statement name="STATEMENT"> <block type="procedures_callnoreturn" id="/6qq{?/)+*vm:UnA$x,0"> <mutation name="Futter"></mutation> </block> </statement> </block> </next> </block> </next> </block> </statement> <next> <block type="comment" id="7wspNJ:OA(%4Ab.`5IAO"> <field name="COMMENT">2. Uhrzeit hh:mm</field> </block> </next> </block> </next> </block> </xml>
Woher kommt jetzt die Uhrzeit in der Liste ???
Und was kommt in den trigger für ein Objekt in die Objekt ID ?
Oder kommt in den trigger dann der datenpunkt rein wo man die Uhrzeit einstellen kann für die erste Futter Dosierung? -
@Aphofis sagte:
kommt in den trigger dann der datenpunkt rein wo man die Uhrzeit einstellen kann für die erste Futter Dosierung?
Ja, steht doch im Kommentar über dem Trigger.
@Aphofis sagte in Hilfe bei zeitsteuerung:
Ist das so korrekt?
Ich habe keine Lust, das zu importieren. Poste bitte den vom Blockly erzeugten Javascript-Code ohne die letzte Zeile in Code tags.
-
var Dauer, Uhrzeit_1, Intervall, schedule_1, Uhrzeit_2, schedule_2, Uhrzeit_3, schedule_3, Uhrzeit_4, schedule_4; /** * Beschreibe diese Funktion … */ function Futter() { Dauer = getState("Aqua_Control.0.Futterautomatik_multiplikator").val; setState("rpi2.0.gpio.25.state"/*Futterautomat_Buchse_4*/, true); // Intervalldauer = Faktor Intervall = setInterval(function () { Dauer = (typeof Dauer == 'number' ? Dauer : 0) + -1; if (Dauer <= 0) { (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})(); } setState("rpi2.0.gpio.25.state"/*Futterautomat_Buchse_4*/, false); }, 800); } // 1. Uhrzeit hh:mm on({id: 'Aqua_Control.0.Futterautomatik_Uhrzeit_1', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_1 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_1) {clearSchedule(schedule_1); schedule_1 = null;}})(); schedule_1 = schedule((Uhrzeit_1[1]).trim() + ' ' + (Uhrzeit_1[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); }); // 2. Uhrzeit hh:mm on({id: 'Aqua_Control.0.Futterautomatik_Uhrzeit_2', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_2 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_2) {clearSchedule(schedule_2); schedule_2 = null;}})(); schedule_2 = schedule((Uhrzeit_2[1]).trim() + ' ' + (Uhrzeit_2[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); }); // 3. Uhrzeit hh:mm on({id: 'Aqua_Control.0.Futterautomatik_Uhrzeit_3', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_3 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_3) {clearSchedule(schedule_3); schedule_3 = null;}})(); schedule_3 = schedule((Uhrzeit_3[1]).trim() + ' ' + (Uhrzeit_3[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); }); // 4. Uhrzeit hh:mm on({id: 'Aqua_Control.0.Futterautomatik_Uhrzeit_4', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_4 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_4) {clearSchedule(schedule_4); schedule_4 = null;}})(); schedule_4 = schedule((Uhrzeit_4[1]).trim() + ' ' + (Uhrzeit_4[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); });
Ok so korrekt?
-
@Aphofis sagte:
so korrekt?
Nicht ganz: Das Auschalten von "rpi2.0.gpio.25.state"/Futterautomat_Buchse_4/ muss innerhalb der Prüfung Dauer <= 0 erfolgen. Die Datenpunkt-ID für den 1. Uhrzeit-Datenpunkt fehlt noch.
-
@paul53
Irgendwie will die Steuerung nicht das Gerät läuft nur für 800 ms mehr nicht.
Ich verstehe noch nicht den gesamten Zusammenhang.var Dauer, Uhrzeit_1, Intervall, schedule_1, Uhrzeit_2, schedule_2, Uhrzeit_3, schedule_3, Uhrzeit_4, schedule_4; /** * Beschreibe diese Funktion … */ function Futter() { Dauer = getState("Aqua_Control.0.Futterautomatik_multiplikator").val; setState("sonoff.0.Aqua_Dosierer.POWER1"/*Aqua_Dosierer_Pumpe_1*/, true); // Intervalldauer = Faktor Intervall = setInterval(function () { Dauer = (typeof Dauer == 'number' ? Dauer : 0) + -1; if (Dauer <= 0) { (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})(); } setState("sonoff.0.Aqua_Dosierer.POWER1"/*Aqua_Dosierer_Pumpe_1*/, false); }, 800); } // 1. Uhrzeit hh:mm on({id: 'sonoff.0.Aqua_Dosierer.POWER1', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_1 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_1) {clearSchedule(schedule_1); schedule_1 = null;}})(); schedule_1 = schedule((Uhrzeit_1[1]).trim() + ' ' + (Uhrzeit_1[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); }); // 2. Uhrzeit hh:mm // 3. Uhrzeit hh:mm // 4. Uhrzeit hh:mm on({id: 'Aqua_Control.0.Futterautomatik_Uhrzeit_4', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_4 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_4) {clearSchedule(schedule_4); schedule_4 = null;}})(); schedule_4 = schedule((Uhrzeit_4[1]).trim() + ' ' + (Uhrzeit_4[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); });
-
@Aphofis sagte:
das Gerät läuft nur für 800 ms mehr nicht.
@paul53 sagte in Hilfe bei zeitsteuerung:
Das Auschalten von "rpi2.0.gpio.25.state"/Futterautomat_Buchse_4/ muss innerhalb der Prüfung Dauer <= 0 erfolgen.
steuere Aqua_Dosierer_Pumpe_1 mit falsch muss in das Maul von falls Dauer <= 0, nicht darunter.
Bist Du sicher, dass das der richtige Datenpunkt ist ?
// 1. Uhrzeit hh:mm on({id: 'sonoff.0.Aqua_Dosierer.POWER1', change: "ne"}, function (obj) {
-
@paul53
Ich habe nur eine nicht gebrauchte dosier Pumpe zum testen benutzt.
Sonst ist der furtterautomat leer bis die Steuerung funktioniert 🤪 -
Jetzt da steuere in der Tasche unter dem stop zyklische Ausführung ist macht die Steuerung nix mehr
-
-
@paul53
Log eingebaut!
Kommt keine Meldung in der log nur das dass Script gestartet ist!
Wieso eigentlich
Erhöhe Dauer um -1 was bewirkt das ?
Das ich zwei datenpunkte habe!? Ist bewusst?
Einer wo die Uhrzeit drin steht wann dosiert werden soll und ein datenpunkt ist so zu sagen wie lange die Dosierung stattfinden soll
Also eine Dosierung sind 800ms
Wenn in dem datenpunkt multiplikator steht zb 3
Dann soll die Dosierung 3x800 Millisekunden lang sein demnach 2400 ms
Hoffe das ist so auch richtig rüber gekommen.
Diese beiden datenpunkte jetzt nur zur Dosierung Futter 1 die anderen können wenn’s läuft -
@Aphofis sagte:
Das ich zwei datenpunkte habe!? Ist bewusst?
Nein, es müssten 3 Datenpunkte sein: Die Dauer enthält der DP "Aqua_Control.0.Futterautomatik_multiplikator", die Pumpensteuerung erfolgt an den DP "sonoff.0.Aqua_Dosierer.POWER1" und in welchem DP steht die Uhrzeit ? Deshalb meine Frage weiter oben:
Bist Du sicher, dass das der richtige Datenpunkt ist ?
Müsste der nicht eine ID haben wie "Aqua_Control.0.Futterautomatik_Uhrzeit_1" ?
-
Das schon klar!
Datenpunkt wie lange dosiert werden soll
Ist der futterautomatik_multiplikator
Mit wert 1-3 zb
Datenpunkt zum testen der auf die Steuerung reagieren soll mit true und false
sonoff.0.Aqua_Dosierer.POWER1
Später dann der futterautomatik Motor
Und der datenpunkt mit der Uhrzeit
Ja ist
Futterautomatik_Uhrzeit_1
Gibt für die erste Futter Dosierung die Zeit an in
Formatierung 16:30 zb -
Wenn’s dann läuft wollte ich die selbe Steuerung dann auch für meine Triton Lösungen und Strontium Dosierung benutzen. Natürlich neu erstellt mit eigenen datenpunkten.
Mega wäre natürlich das wenn man zb 6 Dosierungen am Tag hat mit je 2ml (760ms = 1 ml) das dann in der Steuerung zb alle Dosierungen zusammen gezählt werden und dann in der Programmierung nicht mehr als 12 ml ( 9120ms) am Tag dosiert werden dürfen so noch mal als kleine Sperre das auch wirklich nicht mehr dosiert wird. -
-
@paul53
Ok Danke aber laufen will es immer noch nicht
Komisch ist das es zu Anfang zumindest 800ms gelaufen ist nach dem ich steuere pumpe1 in die Tasche vom Intervall gepackt hatte kam nix mehr -
@Aphofis sagte:
aber laufen will es immer noch nicht
Dann poste mal den aktuellen Javascript-Code (ohne letzte Zeile).
-
Der Code:
var Dauer, Uhrzeit_1, Intervall, schedule_1, Uhrzeit_2, schedule_2, Uhrzeit_3, schedule_3, Uhrzeit_4, schedule_4; /** * Beschreibe diese Funktion … */ function Futter() { Dauer = getState("Aqua_Control.0.Futterautomatik_multiplikator").val; setState("sonoff.0.Aqua_Dosierer.POWER1"/*Aqua_Dosierer_Pumpe_1*/, true); // Intervalldauer = Faktor Intervall = setInterval(function () { Dauer = (typeof Dauer == 'number' ? Dauer : 0) + -1; console.log(Dauer); if (Dauer <= 0) { (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})(); } setState("sonoff.0.Aqua_Dosierer.POWER1"/*Aqua_Dosierer_Pumpe_1*/, false); }, 800); } // 1. Uhrzeit hh:mm on({id: 'sonoff.0.Aqua_Dosierer.POWER1', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_1 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_1) {clearSchedule(schedule_1); schedule_1 = null;}})(); schedule_1 = schedule((Uhrzeit_1[1]).trim() + ' ' + (Uhrzeit_1[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); }); // 3. Uhrzeit hh:mm // 4. Uhrzeit hh:mm on({id: 'Aqua_Control.0.Futterautomatik_Uhrzeit_4', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Uhrzeit_4 = (obj.state ? obj.state.val : "").split(':'); (function () {if (schedule_4) {clearSchedule(schedule_4); schedule_4 = null;}})(); schedule_4 = schedule((Uhrzeit_4[1]).trim() + ' ' + (Uhrzeit_4[0]).trim() + ' ' + '*'.trim() + ' ' + '*'.trim() + ' ' + '*'.trim(), function () { Futter(); }); });
Die datenpunkte: