Git Product home page Git Product logo

ecovacs-deebot.js's People

Contributors

alcalzone avatar alexleventer avatar apfelnutzer avatar benjhess avatar bhuebschen avatar boriswerner avatar dbochicchio avatar dependabot[bot] avatar joostth avatar juliangsibecas avatar m8schmit avatar mrbungle64 avatar nicoduj avatar poket-jony avatar sholzmayer avatar smilebags avatar tmmschmit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ecovacs-deebot.js's Issues

Ozmo 950 SpotArea ?

Leider bekomme ich es nicht hin, den Ozmo 950 mit dem SpotArea zu starten.

vacbot.run("SpotArea", "spot_area", "start", "3");

ist doch so Richtig geschrieben?
Kann mir bitte Jemand ein Beispiel Geben?

Danke :)

Question: Koordinaten herausfinden

Hi,

Wie finde ich den genauen Standort für
Eine bereichs Reinigung

Also die 4 Variablen in dem. Bereich wo er reinigen soll.

Kann ich den deebot einfach in alle 4 Ecken stellen und die Koordinaten abrufen, wahrscheinlich denke ich da zu einfach

SupportedDevices und KnownDevices

In der Datei library/ecovacsConstants.js hatte ich begonnen die 'SupportedDevices' und 'KnownDevices' zu registrieren.

Kriterium für 'SupportedDevices' war für mich, dass Entwickler Zugriff auf diese Modelle haben und diese direkt supporten können (bis vor ein paar Tagen war ich das ja alleine mit meinen 2 Geräten).
Bei 'KnownDevices' hatte ich die Modelle aufgenommen, deren Eigenschaften ich kannte.

Der Aufbau ist aktuell ja folgender (trifft auf beides zu):

   deviceClass: {
        "name": string,
        "main_brush": boolean,
        "spot_area": boolean,
        "custom_area": boolean,
        "mopping_system": boolean,
        "voice_report": boolean,
        'single_room': boolean
    }

Hintergrund war, dass ich die Objekte im ioBroker Adapter (falls sinnvoll) abhängig vom Modell erstellen möchte.

Fragen:

  • Gibt es aktuell Verbesserungsvorschläge?
  • Gibt es Eigenschaften, welche hier noch aufgenommen werden sollten?
  • Wollen wir bei 'SupportedDevices' nun den Ozmo 950 aufnehmen?

control bugs iobroker

Software version (please complete the following information):

  • Library version:
  • Source: "npm", 7.5.3
  • Node.js version: 10.23.3
  • Operating system: raspian
  • Hardware: Raspberry Pi 4

Deebot model (please complete the following information):

  • Model name: [e.g. "Deebot Ozmo 950"]
  • Deebot ozmo 900

Describe the bug
A clear and concise description of what the bug is.
control problem with deebot 900
vor 3-6 wochen oder so ging alles über den adapter wunderbar mittlerweile oft probleme

Additional context
Add any other context about the problem here.
kann starten aber nicht stoppen, mehrfach den adapter neu gestartet, und auch neu angemeldet

How to set number of cleanings to 2 for custom area?

Hi team,
is it possible to set the number of cleanings for a custom area to 2 instead of a single cleaning in the config?

so far I have:
"publishCustomAreaSwitches": [ "1600,6700,4500,10400" ]

Thx for this awesome plugin!!! @ #

GetCleanLogs vs. GetLastCleanLog

GetCleanLogs gibt die letzten 20 Protokolle, so wie sie auch in der App zu finden sind.
GetLastCleanLog gibt (mittlerweile zumindest, das war vor eingier Zeit definitiv auch noch nicht so) die Infos, die in der Hauptansicht zu sehen sind.
Das Protokoll zeigt bei mir eine unvollständige Karte, die auch derzeit an den iobroker gesendet wird. GetLastCleanLog zeigt die vollständige Sicht, wird aber derzeit nicht an iobroker übertragen... Achja... die Funktion scheint denen echt große Probleme zu bereiten.
ToDo:

  • CleanLog_lastImageUrl und CleanLog_lastImageTimestamp über den Befehl GetLastCleanLog beziehen statt über GetCleanLogs

Feature request to set adv. parameters such as "Auto Empty"

Quick note upfront
I just want to say that it is awesome work you are doing here for the community, thanks a lot and well done!

Describe the solution you'd like
I would like to be able to set advanced parameters like "auto empty" to "on/off". I want to do so that I can create HomeKit rules which turn "auto empty" off after 8pm and on again after 8am. It is very noisy but also sometimes in the evening I need the support of my Ozmo to help me clean the kitchen after cooking. Being able to set this function would allow me to both call for a cleanup and keep peace with they neighbours.

I sniffed the communication the of my Ozmo to learn all my map coordinates for my custom areas. At the same time I found how the advanced parameter are set and read. It looks quite straight forward to me, so my hope is that you may be able to add them to the library so I can lobby for a push towards HomeBridge. Alternatively, maybe there is a way for you to implement a general parameter function. Something where the user can input advanced parameters to be set so that you do not always need to update the library. Something like: set.custom_parameter("setAutoEmpty","enable",1)

As follows the capture I did:
{"toType":"fqxoiu","payloadType":"j","toRes":"1Ar1","payload":{"header":{"pri":1,"tzm":60,"ts":"1613246868815","ver":"0.0.50"},"body":{"data":{"enable":0}}},"td":"q","toId":"42______________","cmdName":"setAutoEmpty","auth":{"token":"3d8_______________5757","resource":"IOS842F8B0G9","userid":"_____________","with":"users","realm":"ecouser.net"}}

As I can see, once you toggle it obviously just flips the "enable" bit.
If you want I can do captures for all the advanced settings my Ozmo T8+ exposes.

I am also happy to help implementing them. I don't lack the programming skills but sadly mostly the time and focus needed. I am very happy to donate here for this library and support the work happening. It would be great if you could enable the sponsor/donate function for your project on GitHub. It would be a great way to give back for the work and effort you put in.

Deebot model (please complete the following information):

  • Model name: "Deebot Ozmo T8+"
  • Usage via HomeBridge/HomeKit with the Ecovacs Deebot Plugin by @nicoduj

With many greetings from Berlin,

Robert

Behandlung von Infos beim Deebot Ozmo 950

@boriswerner

Ich vermutete mal stark, dass von den Infos aktuell beim Ozmo 950 nur 'batteryinfo' und 'cleanreport' funktionieren, weil das noch über die _body_data_to_command Methode behandelt wird.
Eigentlich sollte die separate Behandlung für den 950 in der _dict_to_command Methode überflüssig sein.

        if (json.hasOwnProperty('body')) {
            return this._body_data_to_command(json['body']['data']);
        }

Mein Vorschlag wäre, dass wir das erst mal umkehren in der dict_to_command Methode:

    _dict_to_command(json) {
       // Das hier sollte eigentlich inzwischen immer funktionieren
        if (json['event']) {
            return json['event'];
        }
       // Ggf. notwendig ein paar andere Modelle, die wir beide nicht besitzen
        if (json.hasOwnProperty('ctl')) {
            return json['ctl'];
        }
       // Fallback für den Ozmo 950. Sollte aber eigentlich nicht mehr notwendig sein
        if (json.hasOwnProperty('body')) {
            return this._body_data_to_command(json['body']['data']);
        }
    }

Falls das (besser) funktioniert können wir den Fallback und damit auch die _body_data_to_command rauswerfen. Du hattest das ja auch schon mal kurz angemerkt meine ich mich zu erinnern ;)

NOOB instructions.

Just wondering if anyone can outline how to impliment this after installing. Only used to npm and using the config ui.

Cheers

Features report wrong for OZMO slim 10 with latest beta

Hi,

I got I think wrong feature report for OZMO slim 10 with latest beta

[2021-4-20 11:28:40] [DeebotEcovacs] INFO - Edge Cleaning for Alfred : false
[2021-4-20 11:28:40] [DeebotEcovacs] INFO - Spot Cleaning for Alfred : false
[2021-4-20 11:28:40] [DeebotEcovacs] INFO - SpotArea Cleaning for Alfred : true
[2021-4-20 11:28:40] [DeebotEcovacs] INFO - CustomArea Cleaning for Alfred : false

instead of

[4/20/2021, 10:14:46 AM] [homebridge-deebotecovacs] INFO - Edge Cleaning for Alfred : true
[4/20/2021, 10:14:46 AM] [homebridge-deebotecovacs] INFO - Spot Cleaning for Alfred : true
[4/20/2021, 10:14:46 AM] [homebridge-deebotecovacs] INFO - SpotArea Cleaning for Alfred : false
[4/20/2021, 10:14:46 AM] [homebridge-deebotecovacs] INFO - CustomArea Cleaning for Alfred : false

Make canvas installation optional

Some use cases don‘t use a visible map. For example Homebridge Integration or your example files.

I would suggest to remove canvas from the dependencies and change the code that the rendering is only done if canvas is installed manually.

Pause command is not working for OZMO slim 11

Software version (please complete the following information):

  • Library version: 0.6.1-beta.7
  • Source: npm
  • Node.js version: v10.16.3
  • Operating system: Linux
  • Hardware: Raspberry Pi 4

Deebot model (please complete the following information):

  • Model name: OZMO Slim 11 (reported as: DEEBOT OZMO Slim10 Series)

Describe the bug
Pause command is not working (returning 500: timeout)
I have a solution that works specifically for slim 11 as described below but I don't know if it would break other non 950 models.
I also don't know if this is specific to slim 11 (not affecting slim 10), so it is good if any slim 10 owner can confirm.
Any reference I could found says that slim 11 is just white version of slim 10 so technically they are the same.

Additional context
It works if I make modification in vacBotCommand_non950type.js

from:

class Pause extends Clean {
    constructor() {
        super('pause', 'pause');
    }
}

to:

class Pause extends Clean {
    constructor() {
        super('auto', 'pause');
    }
}

Additional info
GetCleanLogs returns empty result. I am aware this is listed as known issues for T9 series but want to add that it is also true for slim 11 (and probably slim 10 as well).
All other functionalities that I tried works, including Resume that already uses super('auto', 'resume'). Great work!

Rooms Area 0-14

'0': {"en": "Default  (A, B, C...)", "de": "Standard (A, B, C...)"},
'1': {"en": "Living room", "de": "Wohnzimmer"},
'2': {"en": "Dining room", "de": "Esszimmer"},
'3': {"en": "Bedroom", "de": "Schlafzimmer"},
'4': {"en": "Study", "de": "Büro"},
'5': {"en": "Kitchen", "de": "Küche"},
'6': {"en": "Bathroom", "de": "Badezimmer"},
'7': {"en": "Laundry", "de": "Waschküche"},
'8': {"en": "Lounge", "de": "Lounge"},
'9': {"en": "Storeroom", "de": "Lagerraum"},
'10': {"en": "Kids room", "de": "Kinderzimmer"},
'11': {"en": "Sunroom", "de": "Wintergarten"},
'12': {"en": "Corridor", "de": "Flur"},
'13': {"en": "Balcony", "de": "Balkon"},
'14': {"en": "Gym", "de": "Fitnessstudio"}

app2.js - cannot find module

Hi,

I tried the current version of app2.js today and got following error in console:

`[EcovacsMQTT_JSON] callEcovacsDeviceAPI failed for cmd getMapSubSet: Error: Cannot find module '../build/Release/canvas.node'
Require stack:

  • /usr/src/dev/ecovacs-deebot.js/node_modules/canvas/lib/bindings.js
  • /usr/src/dev/ecovacs-deebot.js/node_modules/canvas/lib/canvas.js
  • /usr/src/dev/ecovacs-deebot.js/node_modules/canvas/index.js
  • /usr/src/dev/ecovacs-deebot.js/library/mapTemplate.js
  • /usr/src/dev/ecovacs-deebot.js/library/vacBot_950type.js
  • /usr/src/dev/ecovacs-deebot.js/index.js
  • /usr/src/dev/ecovacs-deebot.js/example/app2.js`

Unhandled error when MQTT doesn't return JSON

Software version

  • Library version: current master

Deebot model

  • Model name: All

Describe the bug
When there is a server issue on Ecovac's side, JSON.parse() will fail with a SyntaxError since the returned data is HTML.
That causes an unhandled exception, that can't easily be caught by the client.

I'd suggest adding a try-catch block around the parse and rejecting with a specific error.

Additional context
https://github.com/mrbungle64/ecovacs-deebot.js/blob/master/library/ecovacsMQTT.js#L103

More complete status

Hi @mrbungle64,

the latest iteration of the lib has broken my code, since I was watching for MoppingSystemInfo to get the status, even when not mopping.

So, I'm proposing something similar to this to send a complete report of the most used variables related to status:

emitMoppingSystemReport() {
  var r = {
	  'cleanStatus': this.bot.cleanReport,
	  'cleanInfo': {
		  'speed': (this.bot.cleanSpeed || 0)
	  }
  };
  
  if (this.bot.hasMoppingSystem())
	  r['waterInfo'] = {
		  'enabled': Boolean(Number(this.bot.waterboxInfo || 0)),
		  'level': this.bot.waterLevel || 0
	  }
  
  this.emit("MoppingSystemInfo", r);
  }

The idea behind it is to carry both water info (if present) and clean info (I'm calling it from cleanspeed as well and maybe the function name is not fitting anymore). What do you think?

Support for OZMO Slim 10

Describe the solution you'd like
It would be great, if the cleaning status of the OZMO Slim 10 would be parsed in the script.
Example log:

[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0080' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0080" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='BatteryInfo'><battery power='096'/></ctl>
[EcovacsMQTT] xml received: <ctl td="BatteryInfo"><battery power="096"/></ctl>
[VacBot] *** batteryInfo = 96%
Battery level: 9600%
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0090' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0090" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0100' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0100" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0110' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0110" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0120' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0120" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0130' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0130" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0140' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0140" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='BatteryInfo'><battery power='095'/></ctl>
[EcovacsMQTT] xml received: <ctl td="BatteryInfo"><battery power="095"/></ctl>
[VacBot] *** batteryInfo = 95%
Battery level: 9500%
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0150' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0150" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0160' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0160" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0170' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0170" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0180' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0180" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0190' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0190" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0200' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0200" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0210' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0210" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0220' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0220" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0230' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0230" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0240' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0240" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0250' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0250" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0260' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0260" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='BatteryInfo'><battery power='094'/></ctl>
[EcovacsMQTT] xml received: <ctl td="BatteryInfo"><battery power="094"/></ctl>
[VacBot] *** batteryInfo = 94%
Battery level: 9400%
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0270' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0270" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0280' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0280" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0290' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0290" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0300' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0300" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0310' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0310" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0320' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0320" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='BatteryInfo'><battery power='093'/></ctl>
[EcovacsMQTT] xml received: <ctl td="BatteryInfo"><battery power="093"/></ctl>
[VacBot] *** batteryInfo = 93%
Battery level: 9300%
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0330' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0330" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0340' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0340" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0350' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0350" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0360' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0360" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0370' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0370" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0380' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0380" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='BatteryInfo'><battery power='091'/></ctl>
[EcovacsMQTT] xml received: <ctl td="BatteryInfo"><battery power="091"/></ctl>
[VacBot] *** batteryInfo = 91%
Battery level: 9100%
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0390' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0390" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0400' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0400" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0410' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0410" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='ChargeState'><charge type='Going' h='0' r='a'/></ctl>
[EcovacsMQTT] xml received: <ctl td="ChargeState"><charge type="Going" h="0" r="a"/></ctl>
[VacBot] *** chargeStatus = returning
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0420' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0420" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0430' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0430" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0440' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0440" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='BatteryInfo'><battery power='090'/></ctl>
[EcovacsMQTT] xml received: <ctl td="BatteryInfo"><battery power="090"/></ctl>
[VacBot] *** batteryInfo = 90%
Battery level: 9000%
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0450' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0450" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0460' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0460" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0470' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0470" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='009' s='2' l='0480' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="009" s="2" l="0480" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='error' errs='100'/>
[EcovacsMQTT] xml received: <ctl td="error" errs="100"/>
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0000' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0000" t="a"/>
[tools] Unknown command name: cleanst str: CleanSt
[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='GoChargeBgdata' ts='1616941160' Battery='090' GoChargeId='3771336001' CleanId='1013372899' PreWorkMode='stop' WorkMode='Going' CmdSrc='a' MapId='' OnCharger='0'/>
[EcovacsMQTT] xml received: <ctl td="GoChargeBgdata" ts="1616941160" Battery="090" GoChargeId="3771336001" CleanId="1013372899" PreWorkMode="stop" WorkMode="Going" CmdSrc="a" MapId="" OnCharger="0"/>
[tools] Unknown command name: gochargebgdata str: GoChargeBgdata
[EcovacsMQTT] Unknown command received: GoChargeBgdata
[EcovacsMQTT] message.toString():  <ctl td='ChargeState'><charge type='SlotCharging'/></ctl>
[EcovacsMQTT] xml received: <ctl td="ChargeState"><charge type="SlotCharging"/></ctl>
[VacBot] *** chargeStatus = charging
[EcovacsMQTT] message.toString():  <ctl td='CleanReport'><clean type='auto' speed='strong' st='h' rsn='a'/></ctl>
[EcovacsMQTT] xml received: <ctl td="CleanReport"><clean type="auto" speed="strong" st="h" rsn="a"/></ctl>
[VacBot] *** cleanStatus = stop
[EcovacsMQTT] message.toString():  <ctl td='evt' e='7'/>
[EcovacsMQTT] xml received: <ctl td="evt" e="7"/>
[tools] Unknown command name: evt str: evt
[EcovacsMQTT] Unknown command received: evt
[EcovacsMQTT] message.toString():  <ctl td='GoChargeBgdata' ts='1616941191' Battery='090' GoChargeId='1690986878' CleanId='1013372899' PreWorkMode='stop' WorkMode='Idle' CmdSrc='a' MapId='' OnCharger='1'/>
[EcovacsMQTT] xml received: <ctl td="GoChargeBgdata" ts="1616941191" Battery="090" GoChargeId="1690986878" CleanId="1013372899" PreWorkMode="stop" WorkMode="Idle" CmdSrc="a" MapId="" OnCharger="1"/>
[tools] Unknown command name: gochargebgdata str: GoChargeBgdata
[EcovacsMQTT] Unknown command received: GoChargeBgdata

Deebot model (please complete the following information):

  • Model name: Deebot OZMO Slim 10

Error: Failure code 0002

Hi,

I am evelopping an homebridge plugin for deebots and there is an issue when you try to connect to the API twice from the same device, with consecutive attemps : I often get this error code on connection.

I have fixed this in the original sucks.js and did a pull request, but the maintainer is not there anymore and I would like to switch to your package but can't do any pull request on it since it is a fork also.

Here is the original pull request : jeremy-green/sucks.js#1

I use uniqid dependency, and changed the following line :

params['requestId'] = EcoVacsAPI.md5(Number.parseFloat(Date.now() / 1000).toFixed(0));

to

params['requestId'] = EcoVacsAPI.md5(uniqid());

And then everything is good.

Amount of movement left/right

Hey everybody,
does someone know "how much" does a move left or right actually turn the device?
My Deebot Slim 2 turns like 400° when i trigger a onetime "moveleft".

I also tried to find out something through the code or documentation but it seems we only send a XML with the option "left" or "right" to move. Is that true? Wireshark doesnt work for me as the app sends all requests encrypted (or im doing something wrong....)

Is there any debug mode with which i can enable the envLog messages ?

Thanks!

PS: That's actually not an issue and might be wrong here, feel free to close it

Deprecation warning for npm packages Node.js 12.22.2

Installing ecovacs-deebot.js package in npm I get following deprecation warnings:

npm WARN deprecated [email protected]: this package is deprecated please use https://www.npmjs.com/package/@xmpp/client
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: this package is deprecated please use https://github.com/xmppjs/xmpp.js
npm WARN deprecated [email protected]: this package is deprecated please use https://github.com/xmppjs/xmpp.js
npm WARN deprecated [email protected]: this library is no longer supported

Events with complex objects

Just a question: why are you pushing so many different events, instead of just one with an object inside?

I'm working on a MQTT bridge, and I've successfully modified the ecovacsMQTT_json.js to handle one event, instead of multiple (ie, in case of a clean log):

var lastCleanLogs = {
	timestamp: this.bot.cleanLog_lastTimestamp,
	squareMeters: this.bot.cleanLog_lastSquareMeters,
	lastTime: this.bot.cleanLog_lastTotalTimeString,
	imageUrl: this.bot.cleanLog_lastImageUrl
	// type
	// stopReason
};
this.emit("LastCleanLogs", lastCleanLogs);

I've not extensively looked at the library and I don't know if this sounds too crazy to you, but I could contribute with a pull request if you want help.

PS: love your library, I was able to completely map every commands/event to my mqtt broker!

BatteryLevel NaN%

I have strange behaviour with my 2 Deebot (905, 605), after these lines, it hangs.

$ node app.js
Device ID: xxxxxx
Account ID: xxxxxx
Encrypted account ID: xxxxxx
Password hash: xxxxx
Encrypted password hash: xxxxxxx
Country: IT
Continent: EU
Connected!
Vacbot ready
Clean status: undefined
Clean status: auto
Battery level: NaN%
Charge status: idle
Clean status: auto
Charge status: returning
Clean status: undefined
Clean status: stop

Implementation of ResetLifeSpan and SetLifeSpan

Implemetation finished for non 950 type

Usage

N79 Series

  • SetLifeSpan(component,val)

Example

SetLifeSpan('side_bush',100);
SetLifeSpan('main_brush',100);
SetLifeSpan('filter',100);

Other models

  • ResetLifeSpan(component)

Example

ResetLifeSpan('side_bush');
ResetLifeSpan('main_brush');
ResetLifeSpan('filter');

DeebotPosition and ChargePosition with 3 values - why?

When receiving those two events the return value contains a comma seperated triple - what are these values standing for? X, Y and Z? According to the MapData I receive the first two really seem to be X and Y but I do not understand the third value.

I get for example DeebotPosition (521,24,2) and ChargePosition (523,23,-177)

Multiple devices

Hey @mrbungle64 I've added a new Deebot 920 to my collection and I was trying to adapt my library to multi-bots and finally released it.

I'm not sure if it's me, but I've found that the library is updating only device at a given time. So, if I'm running two devices at the same time, I'm only getting notifications for one (the first one is loading, to be precise). If I ask for updates, it's working.
I'm using the same client instance.

Before giving up and finding a new route, I'm just double check-in with you. Thanks!

Error in xml parsing

Software version (please complete the following information):

  • Library version: [email protected]
  • Source: npm
  • Node.js version: [e.g. "v10.23.0"]
  • Operating system: Homebridge Homebridge plugin
  • Hardware: Synology (docker)

Deebot model (please complete the following information):

  • Ozmo Slim 10

Describe the bug
An error is thrown in the lib with xml parsing . Should be nice to handle them in order to prevent sigterm

[xmldom warning] attribute space is required"td"!!
@#[line:1,col:1]
[xmldom warning] attribute value must after "="
@#[line:1,col:1]
[xmldom error] element parse error: Error: attribute value no end ''' match
@#[line:1,col:1]
[1/28/2021, 11:48:04 AM] TypeError: Cannot read property 'attributes' of undefined
at EcovacsMQTT_XML._command_to_dict (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/ecovacs-deebot/library/ecovacsMQTT_XML.js:184:28)
at EcovacsMQTT_XML._handle_message (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/ecovacs-deebot/library/ecovacsMQTT_XML.js:168:27)
at MqttClient. (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/ecovacs-deebot/library/ecovacsMQTT.js:42:18)
at MqttClient.emit (events.js:315:20)
at MqttClient._handlePublish (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/mqtt/lib/client.js:1277:12)
at MqttClient._handlePacket (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/mqtt/lib/client.js:410:12)
at work (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/mqtt/lib/client.js:321:12)
at Writable.writable._write (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/mqtt/lib/client.js:335:5)
at doWrite (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:409:139)
at writeOrBuffer (/homebridge/node_modules/homebridge-deebotecovacs/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:398:5)
[1/28/2021, 11:48:04 AM] Got SIGTERM, shutting down Homebridge...

Additional context

User in homebridge plugin

Add DEEBOT R95MK2

Since the commit 'added modelName and imageURL' on 6 may, devices not listed in ecovacsConstants.js cause an error. Until that update the r95mk2 worked with the lib.
Is it possible to add the DEEBOT R95MK2. The device info is:
class: 113
company: eco-legacy

Handle correct continent discovery

I have one user in AU that have a problem (nicoduj/homebridge-deebotEcovacs#20) : I think there is no server for this continent (https://portal-oc.ecouser.net) . I am thinking about defaulting automatically in such case to ww server, but could be handled in my lib or in yours, what do you think ?

A simple way to do this woud be to put WW in country.js for such cases ...

I think we should stick to this :

CH: msg.ecouser.net
TW, MY, JP, SG, TH, HK, IN, KR: msg-as.ecouser.net
US: msg-na.ecouser.net
FR, ES, UK, NO, MX, DE, PT, CH, AU, IT, NL, SE, BE, DK: msg-eu.ecouser.net
Any other country: msg-ww.ecouser.net

"ecovacs-deebot.0.control.cleanSpeed" which expects a string.

Hey

erstmal vielen vielen Dank für eure Mühen. Beim herumprobieren ist mir folgendes augefallen.
warum erwartet der einen string und keine number? sind ja schließlich nur nummerische werte drin.

by the way, es wäre toll überall standardwerte drin zu haben damit man besser skripte schreiben kann zB error - ist leer wenn es keinen fehler gibt vl kann man einfach null oder so als standardwert nehmen.

danke

Add ability to toggle Advanced Mode

Describe the solution you want.
Hello,
thank you very much for the time and effort you put into this project!

Everything you can do in the official ecovacs application (and more) can be done with this project,
with the exception of enabling/disabling the "advanced mode". I disable this mode before moving the deebot by hand to clean
an area that is not accessible from the charging station so that the map is not reset.
Maybe this feature is already implemented, but I couldn't find it.

Deebot Model (please complete the following information):

  • Model name: Deebot Ozmo 950, but I think it would work the same way on all recent models.

advmode

Include CleanLogs

With the hint given in bmartin5692/bumper#58
I was able to successfully retrieve the cleaning logs for the Ozmo 950:
Method: POST
Path: /api/lg/log.do?u=tmpuser&av=1.2.1&cv=1.94.28&td=GetCleanLogs&t=i
Body: {'did': 'test_did', 'country': 'US', 'td': 'GetCleanLogs', 'auth': {'token': 'test_token', 'resource': 'app_resource', 'userid': 'tmpuser', 'with': 'users', 'realm': 'ecouser.net'}, 'resource': 'bot_resource'}

This also includes the imageURL to the map in the clean log.
Other function is GetLastCleanLog which only delivers the last log entry.
GetOfflineMap command returns only {"ret":"ok"} for the 950

I will further analyse the topic and include it in the library for the Ozmo 950.

For other bots this comment might be helpful:
wpietri/sucks#78 (comment)

Include live map support

In a bumper issue (wpietri/sucks#78) there are details on the Map messages included:

Using the right base64 text, which in turn produces a well-formed lzma compressed stream, I understood that the map piece binary data is a list of pixels encoded as following:
0x00 is used for empty (undiscovered) pixels
0x01 is used for floor pixels
0x02 is used for wall pixels

Following the python script described there to decode that stream

        # Decode Base64
        data = base64.b64decode(b64)
        
        # Get lzma output size (as done by the Android app)
        len_array = data[5:5+4]
        len_value = ((len_array[0] & 0xFF) | (len_array[1] << 8 & 0xFF00) | (len_array[2] << 16 & 0xFF0000) | (len_array[3] << 24 & 0xFF000000)) 
        
        # Init the LZMA decompressor using the lzma header
        dec = lzma.LZMADecompressor(lzma.FORMAT_RAW, None, [lzma._decode_filter_properties(lzma.FILTER_LZMA1, data[0:5])])
        
        # Decompress the lzma stream to get raw data
        return dec.decompress(data[9:], len_value)

During cleaning the Ozmo 950 sends continuosly infos about the maps that could be processed and drawn.
I will do some more analysis on the topic.

Maybe also parts of the project valetudo-mapper for Xiaomi/Roborock vacs (https://github.com/rand256/valetudo-mapper) can be reused/transferred

Add support for cleaning stats messages (MQTT)

Created from Issue #69

[EcovacsMQTT] Unknown command received: CleanSt
[EcovacsMQTT] message.toString():  <ctl td='CleanSt' a='000' s='2' l='0080' t='a'/>
[EcovacsMQTT] xml received: <ctl td="CleanSt" a="000" s="2" l="0080" t="a"/>

@dsgrafiniert:

However, it would be great if the MQTT messages would trigger events as well.
I am able to interpret the parameters at least partly:
l="0100" is the time since starting the cleaning job in seconds
a="000" is the cleaned space of the current job in square meters

OZMO 950: Saugkraft einstellen möglich? (#25 aus Adapter)

@boriswerner

mrbungle64/ioBroker.ecovacs-deebot#25 (comment)

für waterLevel diesen Wert numerisch ganzzahlig rundet und auf den gewünschten Wert "low(1")
für cleanSpeed den Wert nicht auf "silent(1) sondern auf "high(3)" setzt

Für die nicht-950 Geräte hatte ich Strings für die WaterLevel Werte verwendet:

exports.WATER_LEVEL_TO_ECOVACS = {
    'low': '1',
    'medium': '2',
    'high': '3',
    'max': '4'
};

exports.WATER_LEVEL_FROM_ECOVACS = {
    '1': 'low',
    '2': 'medium',
    '3': 'high',
    '4': 'max'
};

Beim 950 ist es gemischt:

exports.FAN_SPEED_TO_ECOVACS = {
    1: 1000,  //silent
    2: 0,     //normal
    3: 1,     //high
    4: 2      //veryhigh
};

exports.FAN_SPEED_FROM_ECOVACS = {
    1000: 1, //silent
    0: 2,    //normal
    1: 3,    //high
    2: 4     //veryhigh
};

exports.WATER_LEVEL_TO_ECOVACS = {
    'low': 1,
    'medium': 2,
    'high': 3,
    'max': 4
};

exports.WATER_LEVEL_FROM_ECOVACS = {
    '1': 'low',
    '2': 'medium',
    '3': 'high',
    '4': 'max'
};

Das sollten wir einheitlich gestalten.

GetSpotAreaInfo reports cryptical string instead of coordinates (T9+)

When running "GetSpotAreaInfo" agains T9+ I receive some cryptical string like XQAABADVAAAAAByMgwBkPYS7zQalrYrx1hSCG6giOMQsI8RjfOqNPi/yv49O7npECj9XhQHcda+Bs+xFFuP2O4kWhbncYiQYD5rxILTROXPRdDfURxZJVwG66EoA for mapSpotAreaBoundaries. Similar output in app2.js but followed by error callEcovacsDeviceAPI failed for cmd getMapSubSet: TypeError: Cannot read property 'find' of null.

Expected value would be something similar to the value shown in Wiki page of "Map Data"

ErrorCode 3 - RequestOAuthError: Authentication error

ErrorCode 3 - RequestOAuthError: Authentication error
is occuring sometimes during normal operation. It seems to be related to several instances of the library (e.g. different machines or same machine, different devices) running at the same time.

This issue is to track the occurences and describe them as detailed as possible

  • when was/were the instance/s started?
  • when did the error occur?
  • what else could be relevant?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.