indego Plugin
Version 1.x.y
This Plugin can connect to the Indego Server and communicate trough the server with Bosch Indego lawn mowers with Connect feature over GSM (some older models don’t have the connect-feature!).
It is working with the new models like 350 / 400 but also with the older 800/1000/1200 with Connect feature.
With this plugin you can send following commands to your Indego Connect Mower:
Mow (start mowing)
Pause (pause mowing / moving)
go home (go home to charge station)
enable / disable the smart mowing function (the server will decide at which time your mower will start and stop mowing, considering the temperature and weather)
set /get the smart mowing frequency (-100 for the lowest mowing frequency +100 for the highest frequency, in my case „0“ worked the best)
And get information:
Download the actual Map of your garden with a visualization of the part that had been mowed in the actual session and that needs to be mowed. You also see the position of the mower (yellow point). As the Map is only updated from time to time the position is not very accurate.
See the percentage of what had been mowed
See the status of the mower (like docked, mowing, learning garden, going back to the station)
See history data of your Mower (like overall mowing time, charge time, next planned smart mowing time and date
See user data, like Username, Mode, Firmware version, serial number
Get alert messages and the date they occurred and delete them from the server afterwards
Get very accurate weather forecast for your address for the next four days, (incl. exp. sunshine hours, possibility of rain, amount of rain for different daytimes)
The plugin does not offer the possibility to set the times of mowing, this can be handled in the app, or for example here: http://grauonline.de/alexwww/indego/indego.html Please note that you cannot connect with multiple devices at a time with the server. If you connect with the app, the plugin will loose the connection (and try to authenticate again, which will make the authentication of the app invalid). You should avoid to be connecting with the app and the plugin at a time, because it will start the authentication procedure again and again.
Feel free to implement the missing functions in the plugin, as I don’t change them, I have no need to be able to change the mowing dates with the calendar or the location of the mower. If you have a problem please start logging the plugins output in debug mode and check the server responses and Plugin outputs. From time to time Bosch is adding something, so you might also find new features if you have a look at the server response in debug mode. For developing you can use a REST client (for example https://github.com/chao/RESTClient)
For support use this thread: https://knx-user-forum.de/forum/supportforen/smarthome-py/966612-indego-connect
Further Information
Documentation of the server communication:
https://github.com/zazaz-de/iot-device-bosch-indego-controller/blob/master/PROTOCOL.md (might be out-dated!)
https://github.com/zazaz-de/iot-device-bosch-indego-controller/blob/master/README.md
Requirements
Before you can use the plugin you need to install the indego app on a mobile device and register you Indego mower. You will need the Username and Password you set in the app to connect this plugin to the Bosch IOT Server.. For smart mowing it is needed to enter the location in the app or at: http://grauonline.de/alexwww/indego/indego.html
Supported Hardware
Indego Connect 350
Indego Connect 400
Indego 800/1000/1200 with Connect feature.
Configuration
plugin.yaml
Please refer to the documentation generated from plugin.yaml metadata.
MyIndego:
plugin_name: indego
user: 'NUTZERNAME' # -> you need to use the name that you used on your Indego App
password: 'PASSWORT' # -> you need to use the password that you used on your Indego App
cycle: 30 # frequency of when how often the status is updated, is working without a problem with 30seconds, not sure when the server will start to be annoyed by your requests
img_pfad: '/tmp/garden.svg' # path where to save the mapfile, take care you smarthome user has write access
url: 'https://api.indego.iot.bosch-si.com/api/v1/'
parent_item: 'indego' # the parent item for all relating indego items
items.yaml
Todo here Put a sample documentation here Please refer to the documentation generated from plugin.yaml metadata.
Todo here Any logics supported?
logic.yaml
Please refer to the documentation generated from plugin.yaml metadata.
Integration into SmartVISU
for SmartVISU Version
Todo here
You can use the dropins folder for SmartVISU for all additional stuff without affecting the git pull
mechanism
see here https://knx-user-forum.de/forum/supportforen/smartvisu/1144945-k%C3%BCrzlich-hinzugef%C3%BCgte-features and here https://github.com/Martin-Gleiss/smartvisu/blob/develop/dropins/README.md
Methods
Please refer to the documentation generated from plugin.yaml metadata.
Examples
You need the following item structure for the plugin to work (which is provided as example.yaml)
The base item indego
may be changed to something else but it is mandatory.
%YAML 1.1
---
indego:
online:
type: bool
stateCode:
type: num
state_str:
type: str
stateError:
type: num
config_change:
type: bool
indego_add_key: config_change
mow_trig:
type: bool
indego_add_key: mow_trig
stateLevel:
type: num
docked:
type: bool
sqlite: 'yes'
moving:
type: bool
sqlite: 'yes'
pause:
type: bool
sqlite: 'yes'
help:
type: bool
sqlite: 'yes'
mowedPercent:
type: num
mapSvgCacheDate:
type: foo
cache: 'on'
mapUpdateAvailable:
type: bool
mowedDate:
type: foo
cache: 'on'
xPos:
type: num
yPos:
type: num
svg_xPos:
type: num
svg_yPos:
type: foo
mowmode:
type: num
next_time:
type: foo
cache: 'on'
runtimeTotalOperationMins:
type: num
sqlite: 'yes'
hours:
type: num
sqlite: 'yes'
eval: round(sh.indego.runtimeTotalOperationMins()/60,0)
eval_trigger: indego.runtimeTotalOperationMins
runtimeTotalChargeMins:
type: num
sqlite: 'yes'
hours:
type: num
sqlite: 'yes'
eval: round(sh.indego.runtimeTotalChargeMins()/60,0)
eval_trigger: indego.runtimeTotalChargeMins
runtimeSessionOperationMins:
type: num
sqlite: 'yes'
runtimeSessionChargeMins:
type: num
sqlite: 'yes'
SMART:
type: bool
visu_acl: rw
indego_smart: 'yes'
cache: 'on'
frequenz:
type: num
indego_frequency: 'yes'
cache: 'on'
MOW:
type: bool
visu_acl: rw
indego_command: '{"state":"mow"}'
autotimer: 5 = False
PAUSE:
type: bool
visu_acl: rw
indego_command: '{"state":"pause"}'
autotimer: 5 = False
RETURN:
type: bool
visu_acl: rw
indego_command: '{"state":"returnToDock"}'
autotimer: 5 = False
alm_sn:
type: num
alm_name:
type: str
service_counter:
type: num
needs_service:
type: bool
alm_mode:
type: str
bareToolnumber:
type: str
alm_firmware_version:
type: str
cache: 'on'
before:
type: str
cache: 'on'
changed:
type: foo
cache: 'on'
alert_message:
type: str
cache: 'on'
alert_id:
type: str
cache: 'on'
alert_id_send:
type: str
cache: 'on'
alert_flag:
type: str
cache: 'on'
alert_headline:
type: str
cache: 'on'
alert_date:
type: foo
cache: 'on'
weather:
int_0:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_1:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_2:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_3:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_4:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_5:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_6:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_7:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_8:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_9:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_10:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_11:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_12:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_13:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_14:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_15:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_16:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_17:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_18:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
int_19:
wwsymbol_mg2008:
type: num
cache: 'on'
td:
type: num
cache: 'on'
dateTime:
type: foo
cache: 'on'
tt:
type: num
cache: 'on'
wwtext:
type: str
rrr:
type: num
cache: 'on'
prrr:
type: num
cache: 'on'
intervalLength:
type: num
cache: 'on'
spells:
type: bool
cache: 'on'
Sonne:
type: bool
cache: 'on'
Wolken:
type: bool
cache: 'on'
Regen:
type: bool
cache: 'on'
Gewitter:
type: bool
cache: 'on'
day_0:
tx:
type: num
cache: 'on'
date:
type: foo
cache: 'on'
wochentag:
type: str
cache: 'on'
sun:
type: num
cache: 'on'
tn:
type: num
cache: 'on'
day_1:
tx:
type: num
cache: 'on'
date:
type: foo
cache: 'on'
wochentag:
type: str
cache: 'on'
sun:
type: num
cache: 'on'
tn:
type: num
cache: 'on'
day_2:
tx:
type: num
cache: 'on'
date:
type: foo
cache: 'on'
wochentag:
type: str
cache: 'on'
sun:
type: num
cache: 'on'
tn:
type: num
cache: 'on'
day_3:
tx:
type: num
cache: 'on'
date:
type: foo
cache: 'on'
wochentag:
type: str
cache: 'on'
sun:
type: num
cache: 'on'
tn:
type: num
cache: 'on'
day_4:
tx:
type: num
cache: 'on'
date:
type: foo
cache: 'on'
wochentag:
type: str
cache: 'on'
sun:
type: num
cache: 'on'
tn:
type: num
cache: 'on'