NEWS
[Aufruf] Countdown Adapter testen
-
@jackblackson wär cool - namen eingeben und als zweiten parameter löschen/delete
welche datenpunkte muss ich löschen - auch etwas unter setup?
sollte die instanz gestoppt sein?
ich habe dir mal ein im ersten post ein link gesendet - darin habe ich so eine verwandlung von amerikanischen in deutsches datum gemacht - in der beschreibung sieht man auch welche formate möglich sind - vielleicht hilft es ja
if (deadline) var str = getState("javascript.0.Countdown.Termin.Datum").val; if (logging) log(str.indexOf(".")); if (str.indexOf(".") > 0) { var dmyall = str.split(" "); if (logging) log(dmyall[0] + ' ' + dmyall[1]); var dmy = dmyall[0].split("."); if (logging) log(dmy[0] + dmy[1] + dmy[2] + dmyall[0] + dmyall[1]); if (typeof(dmyall[1]) != 'undefined') {deadline = new Date(dmy[1] +'.'+ dmy[0] + '.' + dmy[2] + ' ' + dmyall[1]);if (logging) log("mit Zeit")} else { deadline = new Date(dmy[1] +'.'+ dmy[0] + '.' + dmy[2]);if (logging) log("keine Zeit")}} else {deadline = new Date(getState(idTerminDatum).val);if (logging) log("altes Datumsformat)"); }
https://forum.iobroker.net/topic/22574/vorlage-zeit-herunterzählen-bis-googletermin-eintritt
bei dem fehler von oben - evtl habe ich auch ein falsches datum eingegeben - und dann ist der adapter abgestürtzt - und iobroker wollte ihn neustarten und dann kam der fehler , dass erschon läuft - hast du falscheingaben abgefragt
das mit dem sendto ist ein echter mehrwert - wäre/ist/wird ein super adapter
-
@jackblackson Genau. Ich sehe dafür einige Anwendungsmöglichkeiten. Ich suche z.b. gerade einen Countdown, durch den ich an die Reinigung der Kaffeemaschine erinnert werde (alle 30 Tage). Über ical lohnt sich das meiner Meinung nach nicht. Erinnerungen zum Nachkauf von Verbrauchsartikeln wäre damit auch möglich...
-
@PatrickFro wenn es schnell gehen soll funktioniert das damit - der eigentliche countdown ist das 2te script (javascript) .
aber ich hoffe, es wird in diesem adapter integriert - da tolle idee - dann einfach warten
hier steuer-blockly zum import<xml xmlns="http://www.w3.org/1999/xhtml"> <block type="on" id="Yu_[ga/s]Hyeh8nsx^+:" x="88" y="112"> <field name="OID">javascript.0.Countdown.Termin.inTagen</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="control" id="4Wm(ATbrtz9$IE;YViQ."> <mutation delay_input="false"></mutation> <field name="OID">javascript.0.Countdown.Termin.Datum</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="convert_from_date" id="N?=6!uE55(IgDv+~R@+h"> <mutation format="true" language="false"></mutation> <field name="OPTION">custom</field> <field name="FORMAT">TT.MM.JJJJ SS:mm</field> <value name="VALUE"> <block type="math_arithmetic" id="0zHp1C{=1+0BqMb^]Wve"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id=";rfh%LBqSCHmgS?Lu8gC"> <field name="NUM">1</field> </shadow> <block type="time_get" id="x3FH1{1qx{mjE^G`7[;J"> <mutation format="false" language="false"></mutation> <field name="OPTION">object</field> </block> </value> <value name="B"> <shadow type="math_number" id="8*zEGo+u^A}wgHE0*w:!"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="l]S_I1TT{S1/QP^qOCt$"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="9(cDBM/2W$P,k8.keSSI"> <field name="NUM">1</field> </shadow> <block type="math_number" id="8TC2R-FAd;R(5`=?/vC+"> <field name="NUM">86400000</field> </block> </value> <value name="B"> <shadow type="math_number" id="rgP;5M:c9HlgZF.R9RxU"> <field name="NUM">1</field> </shadow> <block type="get_value" id="9+DRg;F3gTh$C}J~1uq2"> <field name="ATTR">val</field> <field name="OID">javascript.0.Countdown.Termin.inTagen</field> </block> </value> </block> </value> </block> </value> </block> </value> </block> </statement> </block> <block type="schedule" id="1J7D1Q/))cpAR,$0[,Y/" x="62" y="362"> <field name="SCHEDULE">* * * * *</field> <statement name="STATEMENT"> <block type="controls_if" id="Vz9CXtmz#C$?=DIhBrtx"> <value name="IF0"> <block type="logic_compare" id="2iy?B56Y^Qr#XQYNW-}Z"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="MC^AXX]95vxPW?KN#}Il"> <field name="ATTR">val</field> <field name="OID">javascript.0.Countdown.Termin.Datum</field> </block> </value> <value name="B"> <block type="text" id="`/DK+W6T6BxE}D+xQ#e`"> <field name="TEXT">FERTIG</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="txCpapjXf9C}|TaeuAFk"> <mutation delay_input="false"></mutation> <field name="OID">javascript.0.Countdown.Termin.Datum</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="convert_from_date" id="(.4KE[dPnOZR+]OBlgiX"> <mutation format="true" language="false"></mutation> <field name="OPTION">custom</field> <field name="FORMAT">TT.MM.JJJJ SS:mm</field> <value name="VALUE"> <block type="math_arithmetic" id="2([b[!X#}^f])9rC!s(^"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id=";rfh%LBqSCHmgS?Lu8gC"> <field name="NUM">1</field> </shadow> <block type="time_get" id="|zV9MwctrO5Ln,,,z5N3"> <mutation format="false" language="false"></mutation> <field name="OPTION">object</field> </block> </value> <value name="B"> <shadow type="math_number" id="8*zEGo+u^A}wgHE0*w:!"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="]a#l{:!#GH*I`%PitXWq"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="9(cDBM/2W$P,k8.keSSI"> <field name="NUM">1</field> </shadow> <block type="math_number" id="(u53CEM{S@x9y~yafF$#"> <field name="NUM">86400000</field> </block> </value> <value name="B"> <shadow type="math_number" id="rgP;5M:c9HlgZF.R9RxU"> <field name="NUM">1</field> </shadow> <block type="get_value" id="B3Wz6T/T?1}z$.eZ7Yj@"> <field name="ATTR">val</field> <field name="OID">javascript.0.Countdown.Termin.inTagen</field> </block> </value> </block> </value> </block> </value> </block> </value> </block> </statement> </block> </statement> </block> </xml>
und als grundscript den countdown hier zum import
// Termin Skript zählt bis Termin runter erstellt: 26.01.2016 von Pix // weiterverarbeitet 26-2-2019 von liv-in-sky //moegliche formate fur das datum - uhrzeit optional // 9.4.2019 10:00 // 9.4.2019 // 9 May 2019 10:00 - (Monat 3 Buchstaben engl. Abkuerzung) // 9 May 2019 - (Monat 3 Buchstaben engl. Abkuerzung) var instanz = 'javascript.0'; var logging = false; // ab hier nix mehr ändern createState('Countdown.Termin.Datum', '9/4/2019', { name: 'Termin Datum', desc: 'Datum des Termins (als Objekt)', type: 'string' }); createState('Countdown.Termin.Datum.String', '3.12.2019', { name: 'Termin Datum (als String)', desc: 'Datum des Termins als Zeichenkette', type: 'string' }); createState('Countdown.Termin.Name', 'Name des Termins', { name: 'Termin Name', desc: 'Bezeichnung des Termins', type: 'string' }); createState('Countdown.Termin.Rest.TotalText', 'Termingesamt', { name: 'TotalText', desc: 'TotalText', type: 'string' }); createState('Countdown.Termin.Rest.Total', { name: 'Millisekunden bis zum Termin', desc: 'Restliche Millisekunden bis zum Datum des Termins', type: 'number', unit: 'ms' }); createState('Countdown.Termin.Rest.Tage', { name: 'Tage bis zum Termin', desc: 'Restliche Tage bis zum Datum des Termins', type: 'number', unit: 'Tage' }); createState('Countdown.Termin.inTagen', { name: 'Start in Tagen', desc: 'Start in Tagen', type: 'number', unit: 'Tage' }); createState('Countdown.Termin.Rest.Minuten', { name: 'Minuten bis zum Termin', desc: 'Restliche Tage bis zum Datum des Termins', type: 'number', unit: 'Minuten' }); createState('Countdown.Termin.Rest.Stunden', { name: 'Stunden bis zum Termin', desc: 'Restliche Tage bis zum Datum des Termins', type: 'number', unit: 'Stunden' }); createState('Countdown.Termin.Rest.Wochen', { name: 'Wochen bis zum Termin', desc: 'Restliche Wochen bis zum Datum des Termins', type: 'number', unit: 'Wochen' }); createState('Countdown.Termin.Rest.Alarm', { name: 'Alarm', desc: 'Alarm bis zum Datum des Termins', type: 'boolean' }); createState('Countdown.Termin.Rest.Fertig', { name: 'Fertig', desc: 'Fertig', type: 'boolean' }); var idFertig = instanz + '.Countdown.Termin.Rest.Fertig', idAlarm = instanz + '.Countdown.Termin.Rest.Alarm', idStunden = instanz + '.Countdown.Termin.Rest.Stunden', idMinuten = instanz + '.Countdown.Termin.Rest.Minuten', idTotalText = instanz + '.Countdown.Termin.Rest.TotalText', idTerminDatum = instanz + '.Countdown.Termin.Datum', idTerminDatumString = instanz + '.Countdown.Termin.Datum.String', idTerminName = instanz + '.Countdown.Termin.Name', idTotal = instanz + '.Countdown.Termin.Rest.Total', idTage = instanz + '.Countdown.Termin.Rest.Tage', idWochen = instanz + '.Countdown.Termin.Rest.Wochen'; var deadline; function getTimeRemaining(endtime) { var virttime = new Date(); var virt2time=formatDate(virttime); var t = Date.parse(endtime) - Date.parse(virttime); if (virttime.getTimezoneOffset() == -60 && virttime.getTimezoneOffset() == -120 ){t=t+3600000}; if (virttime.getTimezoneOffset() == -120 && virttime.getTimezoneOffset() == -60 ){t=t-3600000}; var seconds = Math.floor( (t/1000) % 60 ); var minutes = Math.floor( (t/1000/60) % 60 ); var hours = Math.floor( (t/(1000*60*60)) % 24 ); var days = Math.floor( t/(1000*60*60*24) ); var weeks = Math.floor( t/(1000*60*60*24*7) ); return { 'total': t, 'days': days, 'hours': hours, 'minutes': minutes, 'seconds': seconds, 'weeks' : weeks }; } function restzeit() { if (deadline) var str = getState("javascript.0.Countdown.Termin.Datum").val; if (logging) log(str.indexOf(".")); if (str.indexOf(".") > 0) { var dmyall = str.split(" "); if (logging) log(dmyall[0] + ' ' + dmyall[1]); var dmy = dmyall[0].split("."); if (logging) log(dmy[0] + dmy[1] + dmy[2] + dmyall[0] + dmyall[1]); if (typeof(dmyall[1]) != 'undefined') {deadline = new Date(dmy[1] +'.'+ dmy[0] + '.' + dmy[2] + ' ' + dmyall[1]);if (logging) log("mit Zeit")} else { deadline = new Date(dmy[1] +'.'+ dmy[0] + '.' + dmy[2]);if (logging) log("keine Zeit")}} else {deadline = new Date(getState(idTerminDatum).val);if (logging) log("altes Datumsformat)"); } setState(idTerminDatumString, formatDate(deadline)); setState(idTage, getTimeRemaining(deadline).days); setState(idWochen, getTimeRemaining(deadline).weeks); setState(idTotal, getTimeRemaining(deadline).total); setState(idMinuten, getTimeRemaining(deadline).minutes); setState(idStunden, getTimeRemaining(deadline).hours); //log(deadline.getTimezoneOffset()); setState(idTotalText, getTimeRemaining(deadline).days.toString() + " Tag(e) " +getTimeRemaining(deadline).hours.toString() + " Stunde(n) " + getTimeRemaining(deadline).minutes.toString() + " Minute(n) "); setTimeout(function () { //The timer if ( getState(idTage).val == 0 && getState(idStunden).val <= 4 ){setState(idAlarm, true) ;} else {setState(idAlarm, false); } // }, 2000); setTimeout(function () { //The timer if ( getState(idTage).val == 0 && getState(idStunden).val == 0 && getState(idMinuten).val <= 0 ){setState(idFertig, true) ;setState(idTerminName, "FERTIG");setState(idTerminDatum, "FERTIG");} else {setState(idFertig, false); } // }, 3000); if (logging) log(getTimeRemaining(deadline).days + ' Resttage (' + getTimeRemaining(deadline).weeks + ' Wochen) bis zum ' + formatDate(deadline) + ' (' + getState(idTerminName).val + ')'); } // Mitternacht schedule('*/1 * * * *', function() { restzeit(); }); //bei Restart var datecounter = getState("javascript.0.Countdown.Termin.Datum").val; if (getState("javascript.0.Countdown.Termin.Datum").val != "") { setStateDelayed("javascript.0.Countdown.Termin.Datum", datecounter, 2000, false);} // Bei Terminänderung on({id: 'javascript.0.Countdown.Termin.Datum', change: 'any'}, function (obj) { deadline = new Date("4.5.2019"); restzeit(); }); // Scriptstart
das blockly script steuert das javascript - alle datenpunkte werden unter javascript.0.countdown angelegt - du musst nur die anzahl tage (javascript.0.Countdown.Termin.inTagen) ändern und schon wird "gecountdownt"
-
super, vielen Dank. Eingebaut ist es, morgen werde ich sehen, ob ich es korrekt gemacht habe
-
@PatrickFro @liv-in-sky So - Version 0.6 ist fertig. Ihr könnt nun das Datumsformat aussuchen - Standard ist DD.MM.YYYY HH.mm. Weiters kann man mit SendTo nur des Namens den Countdown löschen. Es ist auch möglich, mit adddays, addmonths und addyears einen Countdown ab Heute zu erstellen - sollte alles im Readme erklärt sein. Freu mich auf euer Feedback und etwaige Verbesserungsvorschläge - und danke für eure Geduld!
-
- konnte ohne probleme drüber installieren
- konnte alle alten tests löschen
- konnte neue anlegen
- falsches datum wurde erkannt
- konnte existierenden einfach mit neuen datum überschreiben
eine frage - habe es in der vis versucht, einzugeben - also direkt in das datumsfeld zu schreiben - das funktioniert nicht- kann man das noch "enabeln" ? (man kann es über ein script ja auch lösen - falls nicht) (gelber pfeil)
adddays:
ich habe einfach mal einen neuen namen und adddays benutzt - datenpunkte werde angelegt bleiben aber leer - bug oder feature - kann ihn nicht mehr löschen über blockly !
- ist adddays mit exisiterenden countdown oder einem neuen countdown zu nutzen?
-
so wie es aussieht geht adddays nur mit neuem namen - ist das richtig ? das funktioniert jetzt, nachdem ich mal alle alten tests gelöscht habe
einen neuen countdown mit adddays kann ich anlegen und löschen
-
@liv-in-sky
zeige mir doch mal bitte wie ich den Adapter aktuell nutzen kann. (Screeshot Blockly reicht)Beispiel:
Der Rasenmäher schaltet auf Regenpause (state ist vorhanden-true/false), dann soll ein Countdown gestartet werden der mir die Restlaufzeit der Regenpause anzeigt.(bei mir 90 Minuten, auch der state ist vorhanden)
Wenn die Zeit abgelaufen ist, oder der Mäher wieder fährt, kann der Countdown automatisch wieder gelöscht werden oder auf Null gesetzt werden.
Ich würde mir das dann gern in iQontrol anzeigen lassen. (wie lange dauert die Regenpause noch ?) -
PS: ich habe bisher nicht verstanden wie man einen neuen Countdown setzt und dann startet.
Bisher schmiert mir der Adapter mit meinen Versuchen über sendto immer ab und startet ständig neu... -
@dslraser bei dem problem adapter ertmal stoppen - dann
terminal: pgrep countdown.0 -- falls wert zurückommt --> kill "wert" -- dann würde ich alle eintrage in den objecten löschen und die instanz dann wieder starten - wichtig - version 0.6 von github nehmen
ich glaube du kannst keine minuten oder stunden angeben @jackblackson - vielleicht kann man das noch einbauen - addminutes, addhours
beispiel mit adddays:
in der momentanene version müßtest du ein blockly erstellen - zeitjetz +90minuten - und das dann einsetzen - statt 540000 eine variable !
ich nehme mal an, nach dem countdown (datenpinkt "reached" ist true muss der countdown wieder gelöscht werden
ich nehme mal an, nach dem countdown (datenpunkt "reached" ist true muss der countdown wieder gelöscht werden: (nur name als parameter löscht countdown)
-
@liv-in-sky
ah, okay, danke. Also doch noch zu Fuß rechnen. Ich dachte das könnte der Adapter selbst.
Würde jedenfalls Sinn machen.Obwohl, in Deinem Datenpunkt steht ja 1 Stunde 28 Minuten (das ist doch die Restlaufzeit, oder ?)
Das würde ja reichen.
-
@dslraser ja genau - und der datenpunkt "reached" ist true - kann dir beim triggern für das nächst-anfallende helfen
vielleicht kommt das noch dazu - momentan addyears, addmonths, adddays
gut wäre auch addminutes, addhours -
@dslraser es gibt ja noch diese möglichkeit
aber da denke ich ist das ausrechnen für 90 minuten noch mehr
-
@liv-in-sky Ich schau mir das an, das man auch mit adddays überschreiben kann. Es sollte auch mit neuen Countdowns funktionieren - eigentlich nur mit diesen
@dslraser Ich werde noch einen Screenshot für die Add-Sachen im Readme hinzufügen. Ich schau, das ich noch addminutes und addhours einbaue.
Die Datenpunkte bleiben bestehen, wenn im Setup das Autodelete nicht aktiv ist. Dann wechselt Reached auf true .
-
Ich hätte noch einen feature request: so ala command eine Aktion nach Ablauf des Timers ausführen zu können. Klar könnte man auch wieder "extern" Reached überwachen, aber dann für jeden Counter und doch wieder per Hand (zB. per Blockly und nicht per VIS)...
-
@SBorg Was stellst du dir hier vor? Ein Skript ausführen?
-
@liv-in-sky sagte in [Aufruf] Countdown Adapter testen:
- konnte ohne probleme drüber installieren
- konnte alle alten tests löschen
- konnte neue anlegen
- falsches datum wurde erkannt
- konnte existierenden einfach mit neuen datum überschreiben
eine frage - habe es in der vis versucht, einzugeben - also direkt in das datumsfeld zu schreiben - das funktioniert nicht- kann man das noch "enabeln" ? (man kann es über ein script ja auch lösen - falls nicht) (gelber pfeil)
adddays:
ich habe einfach mal einen neuen namen und adddays benutzt - datenpunkte werde angelegt bleiben aber leer - bug oder feature - kann ihn nicht mehr löschen über blockly !
- ist adddays mit exisiterenden countdown oder einem neuen countdown zu nutzen?
- Begüzlich deinem VIS-Thema - was genau machst du hier? Ist dieses Datumsfeld mit dem Datenpunkt im Setup verbunden? Dann sollte das eigentlich gehen - sobald dieser Datenpunkt aktualisiert wird (event. dauert es eine Minute) werden die Werte automatisch aktualisiert
- Adddays & Co sollten auch aktualisierbar sein. Ich nutz es aktuall mit Blocky, und kann den selben Block mehrmals schicken - und es aktualisiert mir die Werte. Hättest du mir mal den Block zum Testen?
-
das vis widget schreibt eigentlich direkt in den datenpunkt
ich teste nochmal - dann mehr
-
das problem ist, dass ich von der vis aus die datenpunkte nicht ändern kann - das geht ja auch nicht unter dem objekt-tab - wahrscheinlich soll das so sein ( ich wollte direct in den datenpunkt .setup.Erster Test3 schreiben.
-
@liv-in-sky Ah, ich verstehe was du meinst, die Schreibrechte auf den Datenpunkt - schau ich mir an, ich seh kein Problem drin das überschreibbar zu machen.