Grove - Sunlight Sensor SI1145 with MicroPython

I am trying to program Grove - Sunlight Sensor SI1145 with MicroPython but I keep get an error


I am using the code from Capteur de lumière solaire SI1145 as I have 2 files, sunlight.py as below:

from time import sleep_ms # Pour gérer les temporisations
from machine import I2C # Pour gérer l’I2C
import si1145 # Pour gérer le capteur

i2c1 = I2C(1)

sleep_ms(1000)

print("Addresses I2C utilise : " + str(i2c1.scan()))

sensor = si1145.SI1145(i2c=i2c1)

while True :
# Indice UV
uv_index = sensor.read_uv

# Valeur caractéristique de l'intensité du rayonnement infrarouge
ir_analog = sensor.read_ir

# Valeur caractéristique de l'intensité du rayonnement visible
visible_analog = sensor.read_visible

# Affichage
print(" Indice UV: %d\n IR: %d (AU)\n Visible: %d (AU)\n" % (uvindex, ir, visible))

# Temporisation de 5 secondes
sleep_ms(5000)

and si1145.py as below:
“”"
MicroPython driver for SI1145 light I2C sensor, low memory version :
]Version: 0.3.0 @ 2018/04/02
“”"

import time
from ustruct import unpack

I2C_ADDRESS = const(0x60)

class SI1145(object):

def __init__(self, i2c=None, addr=I2C_ADDRESS):
	if i2c is None:
		raise ValueError('An I2C object is required.')
	self._i2c = i2c
	self._i2c.scan()
	self._addr = addr
	self._reset()
	self._load_calibration()

def _read8(self, register):
	result = unpack(
		'B',
		self._i2c.readfrom_mem(
			self._addr, register, 1)
	)[0] & 0xFF
	return result

def _read16(self, register, little_endian=True):
	result = unpack('BB', self._i2c.readfrom_mem(self._addr, register, 2))
	result = ((result[1] << 8) | (result[0] & 0xFF))
	if not little_endian:
		result = ((result << 8) & 0xFF00) + (result >> 8)
	return result

def _write8(self, register, value):
	value = value & 0xFF
	self._i2c.writeto_mem(self._addr, register, bytes([value]))

def _reset(self):
	self._write8(0x08, 0x00)
	self._write8(0x09, 0x00)
	self._write8(0x04, 0x00)
	self._write8(0x05, 0x00)
	self._write8(0x06, 0x00)
	self._write8(0x03, 0x00)
	self._write8(0x21, 0xFF)
	self._write8(0x18, 0x01)
	time.sleep(.01)
	self._write8(0x07, 0x17)
	time.sleep(.01)

def _write_param(self, parameter, value):
	self._write8(0x17, value)
	self._write8(0x18, parameter | 0xA0)
	return self._read8(0x2E)

def _load_calibration(self):
	self._write8(0x13, 0x7B)
	self._write8(0x14, 0x6B)
	self._write8(0x15, 0x01)
	self._write8(0x16, 0x00)
	self._write_param( 0x01, 0x80 | 0x40 | 0x20 | 0x10 | 0x01)
	self._write8(0x03, 0x01)
	self._write8(0x04, 0x01)
	self._i2c.writeto_mem(0x60, 0x0F, b'0x03')
	self._write_param(0x07, 0x03)
	self._write_param(0x02, 0x01)
	self._write_param(0x0B, 0)
	self._write_param(0x0A, 0x70)
	self._write_param(0x0C, 0x20 | 0x04)
	self._write_param(0x0E, 0x00)
	self._write_param(0x1E, 0)
	self._write_param(0x1D, 0x70)
	self._write_param(0x1F, 0x20)
	self._write_param(0x11, 0)
	self._write_param(0x10, 0x70)
	self._write_param(0x12, 0x20)
	self._write8(0x08, 0xFF)
	self._write8(0x18, 0x0F)

@property
def read_uv(self):
	return self._read16(0x2C, little_endian=True) / 100

@property
def read_visible(self):
	return self._read16(0x22, little_endian=True)

@property
def read_ir(self):
	return self._read16(0x24, little_endian=True)

@property
def read_prox(self):
	return self._read16(0x26, little_endian=True)