## Bot configuration

```
[bot]
token = "bot token"
users = [ id1, id2 ]
#notify_users = [ 1, 2 ]

[mqtt]
host = "192.168.88.49"
port = 1883
client_id = "kettle_bot"

[logging]
verbose = true
default_fmt = true

[kettle]
mac = 'kettle mac'
token = 'kettle token'
temp_max = 100
temp_min = 30
temp_step = 5
read_timeout = 1
```


## Random research notes

### Device features

From `devices.json`:
```
    "id": "cec1f5ed-be5e-4545-9ce9-e2d843032587",
    "vendor": "polaris",
    "type": 6,
    "class": "kettle",
    "name": "PWK 1725CGLD",
    "connectivity": [
      "wifi",
      "hotspot"
    ],

    ... 

    "features": [
      "program",
      "temperature",
      "current_temperature",
      "schedule",
      "child_lock",
      "semi_recipe",
      "demo"
    ],
    "temperature_units": "celsius",
    "limits": {
      "temperature": {
        "min": 30,
        "max": 100,
        "default": 40,
        "step": 5
      },
      "child_lock": {
        "min": 0,
        "max": 1,
        "default": 0,
        "step": 1
      }
    },
```

### Protocol commands

From `com/polaris/iot/api/commands`:
```
$ grep -A1 -r "public byte getType()" .
./CmdAccessControl.java:   public byte getType() {
./CmdAccessControl.java-      return -123;
--
./CmdBattery.java:   public byte getType() {
./CmdBattery.java-      return 27;
--
./CmdCurrentHumidity.java:   public byte getType() {
./CmdCurrentHumidity.java-      return 19;
--
./CmdMultiStepCurrent.java:   public byte getType() {
./CmdMultiStepCurrent.java-      return 21;
--
./CmdSmartMode.java:   public byte getType() {
./CmdSmartMode.java-      return 40;
--
./CmdTimeStart.java:   public byte getType() {
./CmdTimeStart.java-      return 0;
--
./CmdProgramData.java:   public byte getType() {
./CmdProgramData.java-      return 66;
--
./CmdTank.java:   public byte getType() {
./CmdTank.java-      return 31;
--
./CmdSpeed.java:   public byte getType() {
./CmdSpeed.java-      return 15;
--
./CmdTargetHumidity.java:   public byte getType() {
./CmdTargetHumidity.java-      return 18;
--
./CmdTargetTime.java:   public byte getType() {
./CmdTargetTime.java-      return 3;
--
./CmdRecipeStep.java:   public byte getType() {
./CmdRecipeStep.java-      return 5;
--
./CmdWarmStream.java:   public byte getType() {
./CmdWarmStream.java-      return 25;
--
./CmdMapData.java:   public byte getType() {
./CmdMapData.java-      return 10;
--
./CmdRecipeId.java:   public byte getType() {
./CmdRecipeId.java-      return 4;
--
./CmdBacklight.java:   public byte getType() {
./CmdBacklight.java-      return 28;
--
./CmdCurrentTemperature.java:   public byte getType() {
./CmdCurrentTemperature.java-      return 20;
--
./CmdIonization.java:   public byte getType() {
./CmdIonization.java-      return 24;
--
./CmdMapTarget.java:   public byte getType() {
./CmdMapTarget.java-      return 67;
--
./CmdKeepWarm.java:   public byte getType() {
./CmdKeepWarm.java-      return 16;
--
./CmdMultiStep.java:   public byte getType() {
./CmdMultiStep.java-      return 14;
--
./CmdCleanArea.java:   public byte getType() {
./CmdCleanArea.java-      return 36;
--
./CmdVolume.java:   public byte getType() {
./CmdVolume.java-      return 9;
--
./CmdTargetTemperature.java:   public byte getType() {
./CmdTargetTemperature.java-      return 2;
--
./CmdError.java:   public byte getType() {
./CmdError.java-      return 7;
--
./CmdCleanTime.java:   public byte getType() {
./CmdCleanTime.java-      return 35;
--
./CmdScheduleRemove.java:   public byte getType() {
./CmdScheduleRemove.java-      return 65;
--
./CmdBatteryState.java:   public byte getType() {
./CmdBatteryState.java-      return 29;
--
./CmdExpendables.java:   public byte getType() {
./CmdExpendables.java-      return 34;
--
./CmdContour.java:   public byte getType() {
./CmdContour.java-      return 68;
--
./CmdJoystick.java:   public byte getType() {
./CmdJoystick.java-      return 8;
--
./CmdMode.java:   public byte getType() {
./CmdMode.java-      return 1;
--
./CmdDelayStart.java:   public byte getType() {
./CmdDelayStart.java-      return 13;
--
./CmdTargetId.java:   public byte getType() {
./CmdTargetId.java-      return -112;
--
./CmdInternalLogs.java:   public byte getType() {
./CmdInternalLogs.java-      return -16;
--
./CmdFindMe.java:   public byte getType() {
./CmdFindMe.java-      return 69;
--
./CmdCustomCommand.java:   public byte getType() {
./CmdCustomCommand.java-      return 0;
--
./CmdScheduleSet.java:   public byte getType() {
./CmdScheduleSet.java-      return 64;
--
./CmdTotalTime.java:   public byte getType() {
./CmdTotalTime.java-      return 26;
--
./CmdChildLock.java:   public byte getType() {
./CmdChildLock.java-      return 30;
```

From `com/syncleoiot/iottransport/udp/commands`:
```
$ grep -A1 -r "public byte getType()" .
./CmdDeviceDiagnostics.java:   public byte getType() {
./CmdDeviceDiagnostics.java-      return -111;
--
./CmdHandshake.java:   public byte getType() {
./CmdHandshake.java-      return 0;
--
./CmdUdpFirmware.java:   public byte getType() {
./CmdUdpFirmware.java-      return -3;
--
./CmdTimeSync.java:   public byte getType() {
./CmdTimeSync.java-      return -128;
--
./CmdPing.java:   public byte getType() {
./CmdPing.java-      return -1;
```

From `com/syncleoiot/iottransport/commands`:
```
$ grep -A1 -r "public byte getType()" .
./CmdCrossConfig.java:   public byte getType() {
./CmdCrossConfig.java-      return -125;
--
./CmdWifiConfiguration.java:   public byte getType() {
./CmdWifiConfiguration.java-      return -126;
--
./CmdDiagnostics.java:   public byte getType() {
./CmdDiagnostics.java-      return -115;
--
./CmdWifiStatus.java:   public byte getType() {
./CmdWifiStatus.java-      return -126;
--
./CmdHardware.java:   public byte getType() {
./CmdHardware.java-      return 0;
--
./CmdWifiList.java:   public byte getType() {
./CmdWifiList.java-      return -127;
```

See also class `com/syncleiot/iottransport/commands/CmdHardware`.

## Known problems

- sometimes, after kettle's power reset, zeroconf.ServiceBrowser can't find the service for a long time. 
  Reason is unknown, needs more research. Maybe we should send lookup requests more frequently and _continuously_.

## Other

- sometimes the device looses Wi-Fi connection (it can be seen in AP logs). So if you suffer from
  frequent reconnects/disconnects, it's probably not a bug in protocol implementation but rather
  a problem with your wireless environment or wifi stack on device itself.