anchor.diff:      List<String> fields = message.substring(5, message.length).split(',');
       if (fields.length != 10)
         throw 'Incorrect number of fields in status message from thermostat: $message';
  -    final double temperatureValue = double.tryParse(fields[0]);
  -    ThermostatStatus statusValue;
  -    if (fields[9] == '1') {
  -      if (fields[8] == 'COOL') {
  -        statusValue = ThermostatStatus.cooling;
  -      } else if (fields[8] == 'HEAT') {
  -        statusValue = ThermostatStatus.heating;
  +    double temperatureValue;
  +    if (_temperatureSubscriptionActive || _reportSubscriptionActive) {
  +      temperatureValue = double.tryParse(fields[0]);
  +      if (_temperatureSubscriptionActive)
  +        temperature.add(temperatureValue != null ? new ThermostatTemperature.C(temperatureValue, station: _station, timestamp: timestamp) : null);
  +    }
  +    if (_statusSubscriptionActive) {
  +      ThermostatStatus statusValue;
  +      if (fields[9] == '1') {
  +        if (fields[8] == 'COOL') {
  +          statusValue = ThermostatStatus.cooling;
  +        } else if (fields[8] == 'HEAT') {
  +          statusValue = ThermostatStatus.heating;
  +        } else {
  +          throw 'Unknown thermostat mode "${fields[8]}" in status message: $message';
  +        }
  +      } else if (fields[9] == '0') {
  +        if (fields[3] == 'FAN ON') {
  +          statusValue = ThermostatStatus.fan;
  +        } else if (fields[3] == 'FAN AUTO') {
  +          statusValue = ThermostatStatus.idle;
  +        } else {
  +          throw 'Unknown thermostat fan mode "${fields[3]}" in status message: $message';
  +        }
         } else {
  -        throw 'Unknown thermostat mode "${fields[8]}" in status message: $message';
  +        throw 'Unknown thermostat stage "${fields[9]}" in status message: $message';
         }
  -    } else if (fields[9] == '0') {
  -      if (fields[3] == 'FAN ON') {
  -        statusValue = ThermostatStatus.fan;
  -      } else if (fields[3] == 'FAN AUTO') {
  -        statusValue = ThermostatStatus.idle;
  +      status.add(statusValue);
  +    }
  +    if (_reportSubscriptionActive) {
  +      ThermostatReportMode mode;
  +      switch (fields[2]) {
  +        case 'OFF': mode = ThermostatReportMode.off; break;
  +        case 'COOL': mode = ThermostatReportMode.cool; break;
  +        case 'HEAT': mode = ThermostatReportMode.heat; break;
  +        case 'AUTO': mode = ThermostatReportMode.auto; break;
  +        default: throw 'Unknown thermostat mode "${fields[2]}" in status message: $message';
  +      }
  +      ThermostatReportMode active;
  +      if (fields[9] == '0') {
  +        active = ThermostatReportMode.off;
         } else {
  -        throw 'Unknown thermostat fan mode "${fields[3]}" in status message: $message';
  +        switch (fields[8]) {
  +          case 'COOL': active = ThermostatReportMode.cool; break;
  +          case 'HEAT': active = ThermostatReportMode.heat; break;
  +          default: throw 'Unknown thermostat mode "${fields[8]}" in status message: $message';
  +        }
         }
  -    } else {
  -      throw 'Unknown thermostat stage "${fields[9]}" in status message: $message';
  -    }
  -    temperature.add(temperatureValue != null ? new ThermostatTemperature.C(temperatureValue, station: _station, timestamp: timestamp) : null);
  -    status.add(statusValue);
  +      report.add(ThermostatReport(
  +        temperature: temperatureValue.round(),
  +        minPoint: double.tryParse(fields[6]).round(),
  +        maxPoint: double.tryParse(fields[7]).round(),
  +        mode: mode,
  +        active: active,
  +        fanActive: fields[3] == 'FAN ON',
  +        overrideEnabled: fields[4] == 'YES',
  +        recoveryEnabled: fields[5] == 'YES',
  +      ));
  +    }
     }
   
     Completer<Null> _signal = new Completer<Null>();
  
positive.code:   void _endPollingStatus() {
      assert(_statusSubscriptionActive);
      _statusSubscriptionActive = false;
      _triggerSignal();
    }
  
  
negative.code:   final Completer<String> _completer = new Completer<String>();
  
    Future<String> get result => _completer.future;
  }
  
  enum ThermostatReportMode { off, cool, heat, auto }
  
  class ThermostatReport {
    const ThermostatReport({
      this.temperature,
      this.mode,
      this.fanActive,
      this.overrideEnabled,
      this.recoveryEnabled,
      this.minPoint,
      this.maxPoint,
      this.active,
    }) : assert(temperature >= -128),
         assert(temperature <= 127),
         assert(minPoint >= -128),
         assert(minPoint <= 127),
         assert(maxPoint >= -128),
         assert(maxPoint <= 127);
    
    final int temperature; // 8 bits, signed int8
    final int minPoint; // 8 bits, signed int8
    final int maxPoint; // 8 bits, signed int8
    final ThermostatReportMode mode; // 2 bits, ThermostatReportMode.index
    final ThermostatReportMode active; // 2 bits, ThermostatReportMode.index but not "auto"
    final bool fanActive; // 1 bit
    final bool overrideEnabled; // 1 bit
    final bool recoveryEnabled; // 1 bit
  
    Uint8List encode() {
      final ByteData byteData = ByteData(4);
      byteData.setInt8(0, temperature);
      byteData.setInt8(1, minPoint);
      byteData.setInt8(2, maxPoint);
      byteData.setUint8(3,
        mode.index +                      // 0b00000011 0x01 0x02 (0x03)
        active.index << 2 +               // 0b00001100 0x04 0x08 (0x0C)
        (fanActive ? 0x10 : 0x00) +       // 0b00010000 0x10
        (overrideEnabled ? 0x20 : 0x00) + // 0b00100000 0x20
        (recoveryEnabled ? 0x40 : 0x00)   // 0b01000000 0x40
      );
      return byteData.buffer.asUint8List();
    }
  
    @override
    bool operator ==(Object other) {
      if (other.runtimeType != runtimeType)
        return false;
      return other is ThermostatReport
          && other.temperature == temperature
          && other.minPoint == minPoint
          && other.maxPoint == maxPoint
          && other.mode == mode
          && other.active == active 
          && other.fanActive == fanActive
          && other.overrideEnabled == overrideEnabled
          && other.recoveryEnabled == recoveryEnabled;
    }
  
    @override
    int get hashCode {
      return hashValues(
        temperature.hashCode,
        minPoint.hashCode,
        maxPoint.hashCode,
        mode.hashCode,
        active.hashCode,
        fanActive.hashCode,
        overrideEnabled.hashCode,
        recoveryEnabled.hashCode,
      );
    }
  }
  
  class Thermostat {
  