NEWS
Ecovacs Deebot Adapter: Status und Feedback
-
weil wenn der Deebot auf charging steht, ich die gesamte Dauer der Reinigung habe, also auch mit hin und zurückfahren.
-
@ofri2607 Diese Version funktioniert solange die aktualisierung vor charging kommt. Wenn die erst danach kommt, kommen noch alte Werte zum Beispiel von der Fahrt zum Wartungsplatz.
Wenn ich das richtig verstehe hat sich ja auch der DP geändert im vergleich zur letzten aufgezeichnent Renigung.
Bekomme es einfach nicht hin das er auf die aktualisierung während der Reinigung achten soll, egal ob vorher schon auf charging oder danach auf charging steht.var idTable = '0_userdata.0.JSON.Deebot'; var idRaum = 'ecovacs-deebot.0.map.lastCleanedSpotArea.spotAreaName'; var idFlaeche = 'ecovacs-deebot.0.cleaninglog.lastSquareMeters'; var idDauer = 'ecovacs-deebot.0.cleaninglog.lastTotalTimeString'; var idAktiv = 'ecovacs-deebot.0.status.device'; var idWartungsplatz = '0_userdata.0.Deebot.Wartungsplatz'; var idWartungsplatzEIN = '0_userdata.0.Deebot.WartungsplatzEIN'; var idCleaningTimestamp = 'ecovacs-deebot.0.cleaninglog.lastCleaningTimestamp'; var table = []; if (getState(idTable).val) table = JSON.parse(getState(idTable).val); var obj = {}; var startDate = new Date(); var lastExecutionTime = 0; var isCleaning = false; setState(idWartungsplatzEIN, false, true); // WartungsplatzEIN auf true setzen on(idAktiv, function (dp) { if (getState(idWartungsplatz).val === false && dp.state.val === 'cleaning') { obj = {}; obj.Datum = formatDate(new Date(), 'YYYY-MM-DD '); obj.Start = formatDate(new Date(), 'hh:mm'); startDate = new Date(); isCleaning = true; setState(idWartungsplatzEIN, false, true); // WartungsplatzEIN auf true setzen lastExecutionTime = dp.state.ts; } else if (getState(idWartungsplatzEIN).val === false && dp.state.val === 'charging' && hasStateChanged(idCleaningTimestamp)) { obj.Ende = formatDate(new Date(), 'hh:mm'); obj.Flaeche = getState(idFlaeche).val; obj.Raum = getState(idRaum).val; obj.Dauer = getState(idDauer).val; obj.Dauergesamt = formatDuration(Math.floor((new Date() - startDate) / 1000)); table.unshift(obj); if (table.length > 100) { table.pop(); } setState(idTable, JSON.stringify(table), true); lastExecutionTime = dp.state.ts; isCleaning = false; } }); function hasStateChanged(id) { const state = getState(id); if(!state) return false; // Die State-Variable existiert nicht if(state.ts <= lastExecutionTime || state.val === null) return false; // Der State hat sich seit dem letzten Ausführen des Scripts nicht geändert oder hat keinen Wert return true; } function formatDuration(seconds) { var minutes = Math.floor(seconds / 60); var remainingSeconds = seconds % 60; return pad(minutes, 2) + ':' + pad(remainingSeconds, 2); } function pad(number, length) { var str = '' + number; while (str.length < length) { str = '0' + str; } return str; } //on({id: idWartungsplatz, change: "ne"}, function(obj) { //if (obj.state.val) { // Deebot ist am Wartungsplatz // isCleaning = false; //} //});
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
dann kann ich direkt die Werte von current erfassen wenn der status auf charging steht, ohne irgendwelche zusätlichen bedinungen einzubauen.
Wieso hilft Dir das dabei wenn Du das pro Raum machst?
-
Weil ich nur SpotReinigungen mache.
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
weil wenn der Deebot auf charging steht, ich die gesamte Dauer der Reinigung habe, also auch mit hin und zurückfahren.
Ich gebe @ofri2607 da Recht:
Du solltest auf die Aktualisierung von "last20Logs" triggern. Da solltest du auf jeden Fall die gesamte Dauer der Reinigung haben. -
auf welchen ich trigger ist doch egal, die daten kommen ja alle gleichzeitig rein. Und wenn ich die Daten dann schreiben und der Deebot noch 2.35 min für die fahrt zurück braucht habe ich ja immer noch nicht die gesamte Dauer der Reinigung....
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Diese Version funktioniert solange die aktualisierung vor charging kommt. Wenn die erst danach kommt, kommen noch alte Werte zum Beispiel von der Fahrt zum Wartungsplatz.
Dann würde ich den Trigger auf Beide setzen und die Zeitstempel vom Status, als auch von der Änderung im "last...." Datenpunkt mit einbeziehen.
Wenn der Zeitstempel von der Änderung im "last..." Datenpunkt nach dem Zeitstempel der Statusänderung auf "charging" ist, dann das Log schreiben, sonst auf die Änderung im Status warten und erst dann das Log schreiben. -
@ofri2607 das habe ich ja, aber aus irgenwelchen gründen funktioniert das nicht wenn die aktualsierung nach charging kommt und der Deebot vorher auf dem Wartungsplatz war.
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
@ofri2607 Diese Version funktioniert solange die aktualisierung vor charging kommt. Wenn die erst danach kommt, kommen noch alte Werte zum Beispiel von der Fahrt zum Wartungsplatz.
Wenn ich das richtig verstehe hat sich ja auch der DP geändert im vergleich zur letzten aufgezeichnent Renigung.
Bekomme es einfach nicht hin das er auf die aktualisierung während der Reinigung achten soll, egal ob vorher schon auf charging oder danach auf charging steht.Das ist das Problem im script
} else if (getState(idWartungsplatzEIN).val === false && dp.state.val === 'charging' && hasStateChanged(idCleaningTimestamp)) { obj.Ende = formatDate(new Date(), 'hh:mm'); obj.Flaeche = getState(idFlaeche).val; obj.Raum = getState(idRaum).val; obj.Dauer = getState(idDauer).val; obj.Dauergesamt = formatDuration(Math.floor((new Date() - startDate) / 1000)); table.unshift(obj); if (table.length > 100) { table.pop(); } setState(idTable, JSON.stringify(table), true); lastExecutionTime = dp.state.ts; isCleaning = false; } }); function hasStateChanged(id) { const state = getState(id); if(!state) return false; // Die State-Variable existiert nicht if(state.ts <= lastExecutionTime || state.val === null) return false; // Der State hat sich seit dem letzten Ausführen des Scripts nicht geändert oder hat keinen Wert return true; }
-
Und wenn ich die Daten dann schreiben und der Deebot noch 2.35 min für die fahrt zurück braucht habe ich ja immer noch nicht die gesamte Dauer der Reinigung
Dein Problem besteht ja nur, weil die Reinigung schon am Wartungspunkt beendet ist (und der eine Wert nicht von der API bereitgestellt wird)...
-
und deswegen will ich das mit dem script berrechen was ja auch funktioniert bis auf denn fall was ich jetzt schon mehrmals gesagt habe
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
und deswegen will ich das mit dem script berrechen was ja auch funktioniert bis auf denn fall was ich jetzt schon mehrmals gesagt habe
Vom mehrmals sagen lösen sich aber nicht alle Probleme
Ich kann jetzt nicht einfach eine bestehende Funktion vom Adapter ändern, weil man vermutet, dass es sich dann bei deinem (nicht mehr unterstützen) Modell dann wie gewünscht verhält.
Es gibt keinen Befehl der explizit die Daten für die "current" Werte liefert. Die werden beim clean report mitgeliefert.
Ich kann nicht sagen, ob und wann die API bei deinem Modell die Werte von selbst auf 0 setzt. Von daher bin ich mit der Änderung auch aktuell zurückhaltend. -
@mrbungle64 Wenn es nicht geht, dann ist es halt so, ich ja nicht schlimm .
War ja nur die Frage ob es möglich ist oder nicht. Wenn es nicht möglich ist, muss ich halt schauen wie ich das mi dem Script hinbekomme. Das andere wäre halt nur sehr viel einfacher.
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Das ist das Problem im script
Ich bin unterwegs und kann da leider nichts ausprobieren.
Aber soweit ich das sehe, triggerst du nur auf den Status, d.h. auch deine Überprüfung mit deiner "function hasStateChanged(id)" auf den Zeitstempel bei "lastCleaningTimestamp" wird nur dann ausgeführt, wenn der Status sich ändert.
Das meint ich damit, dass ich den Trigger auf Beide setzten würde:
Sinngemäß so in der Art:on({id: ['ecovacs-deebot.0.status.device', 'ecovacs-deebot.0.cleaninglog.lastCleaningTimestamp'] , change: "gt"}, function(obj){ });
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
@mrbungle64 Wenn es nicht geht, dann ist es halt so, ich ja nicht schlimm .
War ja nur die Frage ob es möglich ist oder nicht. Wenn es nicht möglich ist, muss ich halt schauen wie ich das mi dem Script hinbekomme. Das andere wäre halt nur sehr viel einfacher.
Ich will ja gar nicht sagen, dass es nicht geht.
Ich muss nur bedenken, dass es mehr User gibt als die die gerade aktuell einen Wunsch äußern. Auch muss ich bedenken, dass sich jedes Modell wieder anders verhalten kann.
Bis Ende letzten Jahres hatte ich noch einen Deebot 901 im Schlafzimmer in Betrieb - da macht aber der Akku Probleme - daher habe ich den ersetzt und kann daher solche Dinge nicht mehr mit diesem Gerät nachstellen oder testen.
Mal abgesehen davon muss ich auch schauen, dass ich mein Zeitkontingent sinnvoll nutze. Und das ist nicht so groß, dass ich alle Wünsche erfüllen kann. Man muss dann schon schauen, ob das nur einen ganz speziellen Fall bedient, oder ob es einen Nutzen dabei gibt, der mehrere User betrifft (und ich es im Optimalfall auch selbst nutzen kann).
-
@mrbungle64 sagte in Ecovacs Deebot Adapter: Status und Feedback:
Ich muss nur bedenken, dass es mehr User gibt
Für mich wäre es z.B. eher kontraproduktiv, wenn sich das Verhalten in den "current" Datenpunkte ändern würde, denn in in einem Punkt in meinem Script ziele ich genau darauf ab, dass dieser mit Ende der aktuellen Reinigung auf 0 gesetzt wird.
-
@ofri2607 sagte in Ecovacs Deebot Adapter: Status und Feedback:
@mrbungle64 sagte in Ecovacs Deebot Adapter: Status und Feedback:
Ich muss nur bedenken, dass es mehr User gibt
Für mich wäre es z.B. eher kontraproduktiv, wenn sich das Verhalten in den "current" Datenpunkte ändern würde, denn in in einem Punkt in meinem Script ziele ich genau darauf ab, dass dieser mit Ende der aktuellen Reinigung auf 0 gesetzt wird.
Genau so was meine ich, @Chris76e
-
Alles Gut.
Wie gesagt, ist ja nicht schlimm, nur dann weiß ich jetzt das ich das script irgendwie hinbekommen muss. -
@ofri2607 sagte in Ecovacs Deebot Adapter: Status und Feedback:
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Das ist das Problem im script
Ich bin unterwegs und kann da leider nichts ausprobieren.
Aber soweit ich das sehe, triggerst du nur auf den Status, d.h. auch deine Überprüfung mit deiner "function hasStateChanged(id)" auf den Zeitstempel bei "lastCleaningTimestamp" wird nur dann ausgeführt, wenn der Status sich ändert.
Das meint ich damit, dass ich den Trigger auf Beide setzten würde:
Sinngemäß so in der Art:on({id: ['ecovacs-deebot.0.status.device', 'ecovacs-deebot.0.cleaninglog.lastCleaningTimestamp'] , change: "gt"}, function(obj){ });
Einfach auf change beim ...status.device ist ja auch nicht richtig, bevor charging kommt, kommt ja noch returing.....
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Einfach auf change beim ...status.device ist ja auch nicht richtig, bevor charging kommt, kommt ja noch returing.....
Ja klar, da müsstest du dann auch in dem "on.." die Auswertung der .ts und auch den Status getState('ecovacs-deebot.0.status.device').val == 'charging' mit einbauen.
Kann dir leider, wie gesagt, aktuell kein Codebeispiel im Detail zusammenstellen, da ich es nicht testen könnte.
Aber als Idee so ungefähr in der Richtung dann z.B.:on({id: ['ecovacs-deebot.0.status.device', 'ecovacs-deebot.0.cleaninglog.lastCleaningTimestamp'] , change: "gt"}, function(obj){ if (getState('ecovacs-deebot.0.status.device').val == 'cleaning' && getState('ecovacs-deebot.0.status.device').ts < getSate('ecovacs-deebot.0.cleaninglog.lastCleaningTimestamp').ts) { }; });
Ev. brauchst dann noch eine zusätzliche Prüfung, wenn die Aktualisierung von "lastCleaningTimestamp" doch schon vor der Statusänderung zu "cleaning" erfolgt.
Wollte dir damit nur ein paar Gedankenanregungen lieferen. -
Danke, werde das mal versuchen.