NEWS
Ecovacs Deebot Adapter: Status und Feedback
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
@mrbungle64 sagte in Ecovacs Deebot Adapter: Status und Feedback:
Dann würde ich sagen, dass die API beim Deebot 901 dazu leider keinen Wert liefert ...
Okay, aber dann würde das ja auch egal sein wenn die DP´s und current erst später zurückgesetzt werden, dann da gibt es den DP
Auf was ist das bezogen?
-
auf das
@mrbungle64 sagte in Ecovacs Deebot Adapter: Status und Feedback:
das der DP ecovacs-deebot.0.cleaninglog.lastTotalSeconds auf (null) steht
und das
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Was wären jetzt deine Wünsche an den Adapter um das Script umzusetzen?
- das die DP unter ecovacs-deebot.0.cleaninglog.current erst dann zurückgesetzt werden,
wenn eine neue Reinigung stattfindet und nicht sofort wenn sich der Status von
ecovacs-deebot.0.status.device von "cleaning" auf "returing" ändert.
- das die DP unter ecovacs-deebot.0.cleaninglog.current erst dann zurückgesetzt werden,
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
auf das
@mrbungle64 sagte in Ecovacs Deebot Adapter: Status und Feedback:
das der DP ecovacs-deebot.0.cleaninglog.lastTotalSeconds auf (null) steht
und das
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Was wären jetzt deine Wünsche an den Adapter um das Script umzusetzen?
- das die DP unter ecovacs-deebot.0.cleaninglog.current erst dann zurückgesetzt werden,
wenn eine neue Reinigung stattfindet und nicht sofort wenn sich der Status von
ecovacs-deebot.0.status.device von "cleaning" auf "returing" ändert.
Ja, aber ich meine:
- ist es dann "egal", ob dein Wunsch umgesetzt wird?
- oder ist es "egal", weil der Datenpunkt eh keinen Wert hat man den Wunsch erst recht umsetzen kann?
Ich würde gerne Deine Erwartungshaltung an mich verstehen
- das die DP unter ecovacs-deebot.0.cleaninglog.current erst dann zurückgesetzt werden,
-
@mrbungle64 Wenn das mit den current umgesetzt würde, währe das andere, zumindest für mich nicht mehr wichtig, da ich ja denn da die sekunden habe.
-
@mrbungle64 sagte in Ecovacs Deebot Adapter: Status und Feedback:
Ich nehme mal an, dass du die "IndexSizeError: The source width is 0" Warnung meinst ...
ja, aber bis jetzt nicht mehr aufgetreten.
-
@chris76e ganz klar ist mir zwar auch nicht was du vor hast, aber ich denke dein Problem lässt sich in Javascript relativ leicht, auch ohne Adapteranpassung, beim Setzen der Werte in "current" auf 0 mit oldState des jeweiligen Datenpunktes lösen.
Als einfaches Beispiel:
var Wert = 0; on({id: 'ecovacs-deebot.0.cleaninglog.current.cleanedSeconds', change: 'le'}, function(obj){ //Wert wenn cleanedSeconds auf 0 gesetzt wird Wert = obj.oldState.val; });
Ich nutze das so ähnlich z.B., um mir den vorhergehenden Raum zu holen um damit dann eine Markierung auf der Karte zu setzen.
-
Aber die Werte von current sind ja nicht immer aktuell. Die werden ja nur in bestimmten intervallen aktualisiert. Da durch bekomme ich ja keine zuverlässigen Daten.
Versuche nochmal zuerklären was ich genau vorhabe.
Möchte eine eigenes LastCleaningLog erstellen wo auch der Raum und die Gesamtdauer der aktuellen Reinigung erfasst wird.
und weil ich noch ein 2. log habe wo nur die Fahrten zum Wartungsplatzt gesichert werden kommt das 1. Script wohl nicht mehr richtig mit.
const idTable = '0_userdata.0.Deebot.WartungsplatzJSON'; const idStatus = 'ecovacs-deebot.0.status.device'; const idWartungsplatzDatum = '0_userdata.0.Deebot.WartungsplatzDatum'; const idWartungsplatzUhrzeit = '0_userdata.0.Deebot.WartungsplatzUhrzeit'; const idWartungsplatzEIN = '0_userdata.0.Deebot.WartungsplatzEIN'; var table = []; if(getState(idTable).val) table = JSON.parse(getState(idTable).val); var obj = {}; var startDate = null; var endDate = null; var stopTime = null; on({id: "0_userdata.0.Deebot.Wartungsplatz"/*Wartungsplatz*/, change: "ge"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (value >= oldValue) { startDate = new Date(); setState(idWartungsplatzEIN, true, true); // WartungsplatzEIN auf true setzen } }); on({id: idStatus, change: 'ne'}, function (obj) { if (obj.state.val === 'charging' && startDate) { endDate = new Date(); setState('0_userdata.0.Deebot.WartungsplatzUhrzeit', formatDate(new Date(), 'hh:mm'), true); obj = {}; obj.Datum = formatDate(new Date(), 'YYYY-MM-DD'); obj.Start = formatDate(startDate, 'hh:mm'); obj.Ende = formatDate(endDate, 'hh:mm'); obj.Dauer = formatDuration(Math.floor((endDate - startDate) / 1000)); // Setze Ladestation und Wartungsplatz auf false setState(idWartungsplatzDatum, obj.Datum, true); setState('0_userdata.0.Deebot.Ladestation', false, true); setState('0_userdata.0.Deebot.Wartungsplatz', false, true); //setState(idWartungsplatzEIN, false, true); // WartungsplatzEIN auf false setzen if (stopTime) { obj.Uhrzeit = formatDate(stopTime, 'hh:mm'); stopTime = null; } table.unshift(obj); if (table.length > 100) { table.pop(); } setState(idTable, JSON.stringify(table), true); startDate = null; endDate = null; } else if (obj.state.val === 'stopped') { stopTime = new Date(); } }); 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; }
-
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:
Aber die Werte von current sind ja nicht immer aktuell. Die werden ja nur in bestimmten intervallen aktualisiert. Da durch bekomme ich ja keine zuverlässigen Daten.
Was ist Deine Erwartungshaltung an die Daten, damit Du diese als "aktuell" und "zuverlässig" bezeichnen kannst?
Möchte eine eigenes LastCleaningLog erstellen wo auch der Raum und die Gesamtdauer der aktuellen Reinigung erfasst wird.
Wie hilft Dir die gewünschte Änderung, dass die Werte unter "current" erst später zurückgesetzt werden dabei?
-
@chris76e ok, ich glaube jetzt verstehe ich etwas besser was du vor hast, vor Allem in Kombination mit deinem Post zuvor:
@chris76e sagte in Ecovacs Deebot Adapter: Status und Feedback:Als bedingung dafür habe ich das wenn der deebot wieder an der Ladestation befindet, also ecovacs-deebot.0.status.device auf "charging" steht. Aber ab und zu kommt es vor das die Daten die ich von lastCleaning brauche noch nicht da sind von der DP auf charging steht. Würden die Daten von current nicht direkt zurückgesetzt werden, könnte ich diese nehmen, sind ja die gleichen die dann und lastCleaning kommen.
Warum nimmst du als Trigger für das Schreiben deines LastCleaningLogs den StatusDP mit "charging"?
Ich nehme hier als Trigger für eine Anzeige der letzten Reinigung in der Vis, die Änderung des Datenpunktes "last20Logs" - geht aber mE jeder andere Datenpunkt mit "last...." auch, die kommen bei mir ziemlich zeitgleich herein.
D.h. jedesmal wenn der neu geschrieben wird, hast du dann auch sicher alle Infos in den "last..." Datenpunkten und brauchst gar nicht auf die Datenpunkte in "current" zurückgreifen.Das funktioniert bei mir zur Anzeige "Letzte Reinigung" sehr zuverlässig (die 0 m² sind nur, weil er testweise nur ganz kurz gelaufen ist):
-
dann kann ich direkt die Werte von current erfassen wenn der status auf charging steht, ohne irgendwelche zusätlichen bedinungen einzubauen.
-
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