docs: def update(self, first_reading=False):
          """Read raw data and update compensated variables."""
          try:
              if first_reading or not self._ok:
                  self._bus.write_byte_data(self._i2c_add, 0xF2,
                                            self.ctrl_hum_reg)
                  self._bus.write_byte_data(self._i2c_add, 0xF5, self.config_reg)
                  self._bus.write_byte_data(self._i2c_add, 0xF4,
                                            self.ctrl_meas_reg)
                  self._populate_calibration_data()
  
              if self.mode == 2:  # MODE_FORCED
                  self._take_forced_measurement()
  
              data = []
              for i in range(0xF7, 0xF7 + 8):
                  data.append(self._bus.read_byte_data(self._i2c_add, i))
          except OSError as exc:
              self.log_error("Bad update: %s", exc)
              self._ok = False
              return
  
          pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
          temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
          hum_raw = (data[6] << 8) | data[7]
          self._ok = False
  
          temperature = self._compensate_temperature(temp_raw)
          if (temperature >= -20) and (temperature < 80):
              self._temperature = temperature
              self._ok = True
          if self._with_humidity:
              humidity = self._compensate_humidity(hum_raw)
              if (humidity >= 0) and (humidity <= 100):
                  self._humidity = humidity
              else:
                  self._ok = False
          if self._with_pressure:
              pressure = self._compensate_pressure(pres_raw)
              if pressure > 100:
                  self._pressure = pressure
              else:
                  self._ok = False